Bonjour,
Je fais mes premiers pas dans le php objet couplé à pdo, avec le pattern singleton.
J'ai fait une classe bdd qui me connecte à la bdd, avec un singleton pour réutiliser la même instance pour chaque objet, et j'ai écrit une classe acteurMapping pour aller chercher des données dans ma bdd, une classe qui hérite de bdd. Mais j'ai un bug et je câle et il y a bien sur quelque chose, une logique de php objet (ou de l'objet tout court) qui m'échappe...

Voici mon code :

bdd.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
 
   class bdd {
 
      private static $_instance = null;
      protected $connexion;
 
      public function __construct() {
         echo 'constructeur bdd';
         try {
            echo 'instanciation pdo';
            $this->connexion = new PDO('mysql:host='.SERVEUR.';port=3306;dbname='.BASE, LOGIN, PWD);
            var_dump($this->connexion);
         }
         catch(Exception $e)
         {
               echo 'Erreur : '.$e->getMessage();
               echo 'N° : '.$e->getCode();        
               die();
         }
      }
 
      final public static function getInstance() {      
         if(is_null(self::$_instance)) {       
            self::$_instance = new bdd();       
         }      
         return self::$_instance;   
      }
 
      private function __clone()
      {
 
      }
 
 
   }
 
?>
acteurMapping.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
 
   class acteurMapping extends bdd { 
 
      private $_table;
      private $_index;
      //private $_db;
 
      public function __construct() { 
         echo 'constructeur acteurMapping';
         $this->getInstance();
         var_dump($this->connexion);
         $this->_table = "participant";
         $this->_index = "idParticipant";
      }  
 
      public function listeActeur() {
 
         $resultats=$this->connexion->query('SELECT nomPart, prenomPart FROM '.$this->_table.' ORDER BY nomPart ASC');
         $resultats->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
         while( $ligne = $resultats->fetch() ) // on récupère la liste des acteurs
         {
               echo $ligne->nomPart.' '.$ligne->prenomPart; // on affiche les acteurs
         }
         $resultats->closeCursor(); // on ferme le curseur des résultats
      }
 
   }
 
?>
Quand j'instancie acteurMapping et que j'exécute la méthode listeActeur, j'ai le message :

constructeur acteurMapping
constructeur bdd
instanciation pdo
object(PDO)#3 (0) { } NULL
Fatal error: Call to a member function query() on a non-object in C:\Program Files\EasyPHP 3.0\www\pdo\class\acteurMapping.php on line 23
et donc l'attribut connexion qui est nul.

A priori, si je lis les echo, ça fait :

. appel du constructeur de acteurMapping
. appel de la fonction getInstance de bdd
. appel du constructeur de bdd
. affectation d'un objet pdo à l'attribut connexion de bdd
. bug : non affectation d'un objet pdo à l'attribut connexion de acteurMapping pourtant hérité


Merci à celle et ceux qui prendront du temps pour m'aider

Justin