Citation

J’ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone.

Bjarne Stroustrup

vendredi 10 mai 2013

FuelPHP Pas à pas #8 - 2ème model : accès à la base de données

Dans le billet FuelPHP Pas à pas #6 - 1er model j'avais créé un pseudo modèle. En général les données sont dans une base de données. Voyons comment faire pour accéder à la base de données.

Configuration de l'accès

 La configuration se fait dans le fichier de configuration "db.php" qui se trouve...hé bien ça dépend de l'environnement dans lequel on exécute le programme. Si on est en "DEVELOPMENT" le fichier est dans APPPATH/config/development. Voici le contenu pour un accès à une base MySql:

return array(
    'default' => array(
        'connection'  => array(
            'dsn'        => 'mysql:host=localhost;dbname=fuel',
            'username'   => 'root',
            'password'   => '',
        ),
    ),
);


On va créer un base de données, avec une table fruits, voici le script de la table fruits:

CREATE TABLE `fruits` (
  `name` varchar(20) NOT NULL,
  `description` tinytext,
  PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into fruits values
('pomme' , 'rond, jaune ou vert, ou rouge'),
('banane' , 'long et jaune'),
('orange', 'rond et orange'),
('mandarine' , 'comme une petite orange');

Création des fichiers nécessaires

Comme le mécanisme est le même que pour "FuelPHP Pas à pas #6 - 1er model", on se contente de copier les fichiers en leur ajoutant DB à la fin du nom du fichier, on obtient les fichier suivants : APPPATH/classes/controller/fruitsDB.php, APPPATH/classes/model/FruitsDB.php, APPPATH/views/fruits/listDB.php et APPPATH/views/fruits/descrDB.php.
Le code change assez peut pour la plus part des fichiers:

APPPATH/classes/controller/fruitsDB.php :
<?php
class Controller_FruitsDB extends Controller_Template {

   public function action_index(){
      $this->template->title = 'Fruits';
      $v = View::forge();
      $v->fruits = \Model_FruitsDB::get_list();
      $this->template->set_safe('content',$v->render('fruits/listDB'));
   }
   public function action_view(){
      $v = View::forge();
      $data = \Model_FruitsDB::get_fruit($this->param('fruit'));
      if ($data==''){

         Session::set_flash('error','fruit introuvable: '.$this->param('fruit'));
         Response::redirect('fruits');
         return;
      }

      $v->set($data);
      $this->template->title = 'Fruit : '.$data['name'];
      $this->template->set_safe('content',$v->render('fruits/descrDB'));
   }
}


APPPATH/views/fruits/descrDB.php
<?php echo $name. ' : ' . $description; ?></br>
<?php echo Html::anchor('fruitsDB','Liste des fruits')?>


 APPPATH/views/fruits/listDB.php
<?php foreach($fruits as $fruit): ?>
<?php echo Html::anchor('fruitsDB/view/'.$fruit['name'],$fruit['name'])."</br>"; ?>
<?php endforeach;?>


APPPATH/classes/model/FruitsDB.php
Ce fichier change beaucoup puisque on accède à la base de données:
<?php
    class Model_FruitsDB extends Model{
        public static function get_list(){
            $q =DB::query('SELECT * FROM FRUITS');
            $a = $q->execute()->as_array();
            return $a;
        }


        public static function get_fruit($name){
            $q = DB::query('SELECT * FROM FRUITS WHERE NAME='.DB::escape($name));
            $a = $q->execute()->as_array();
            return $a[0];
        }
}


Si on compare avec le code d'origine, les différences sont minces, elle n'existent que parce que l'on a créé de nouveaux fichiers. Si on avait utilisé les fichiers de départs (ceux du #6) seul APPPATH/classes/model/Fruits.php aurait changé.

DB est la classe qui permet d'accéder  la base de données. Ici on lui demande de générer un objet correspondant à la requête que l'on veux exécuter. Ensuite on récupère le contenu dans le tableau $a que l'on renvoi.

Un petit test vers http://localhost/fuelphp/public/ ...et ça ne marche pas! En effet il reste à modifier le fichier "routes.php" en ajoutant la ligne:

'fruitsDB/view/:fruit' => array('fruitsDB/view', 'name'=>'pomme'),

Maintenant ça devrait fonctionner!

Aucun commentaire:

Enregistrer un commentaire