récupérer collection d'objets en PHP depuis une D.B.

récupérer collection d'objets en PHP depuis une D.B. - PHP - Programmation

Marsh Posté le 25-01-2018 à 15:38:18    

Bonjour à tous,  
 
je vous demande de l'aide, car je n'arrive pas à capter la façon dont je peux récupérer une collection d'objets en PHP à partir d'une D.B.
 

Code :
  1. class professeur {
  2.   public $nom;
  3.   public $prenom;
  4.   public function __construct($nom, $prenom){
  5.     $this->nom = $nom;
  6.     $this->prenom = $prenom;
  7.   }
  8. }
  9. $req = $pdo -> prepare('SELECT nom, prenom FROM professeur');
  10. $req -> execute();
  11. $datas = $req -> fetchAll(PDO::FETCH_CLASS, 'professeur', array('', ''));
  12. var_dump($datas);


 
 
Sans constructeur dans ma classe 'professeur' tout va bien ; je peux me passer du troisième argument dans "fetchAll" ... il me récupère bien une liste de profs. depuis ma table 'professeur'
 
Avec le constructeur dans ma classe, il exige ce troisième argument, mais je ne vois pas l'intérêt puisque tous mes objets portent le nom et prénom = "" ...
 
Donc quoi mettre dans array ? ou bien autre chose à mettre ?
 
 
Merci d'avance.  

Reply

Marsh Posté le 25-01-2018 à 15:38:18   

Reply

Marsh Posté le 25-01-2018 à 16:23:04    

PDO s'occupe des attributs en leur affectant la valeur de la colonne du même nom.
 
Tu n'as donc pas besoin que ton constructeur s'en occupe ni de lui passer des paramètres.
 
=> Supprimes ton constructeur et le troisième paramètre de ton appel à  PDOStatement::fetchAll.
 
Le problème, j'imagine, est que si ta classe n'est pas utilisée que par PDO, comment "hydrater" ton objet ? Dans ce cas, il faut rendre le(s) paramètre(s) de celui-ci optionnel(s) et/ou passer par les mutateurs quand tu crées toi-même un objet de façon à ce que la classe soit compatible avec le fonctionnement de PDO.
 
PS : pour le nom de la classe, à moins d'utiliser une vieille version de PHP (PHP < 5.5), je pense qu'il est préférable d'utiliser la notation professeur::class.


Message édité par pluj le 25-01-2018 à 16:56:10
Reply

Marsh Posté le 25-01-2018 à 16:28:45    

Merci pour ta réponse,  
 
mais j'ai besoin de mon constructeur dans d'autres endroits du code autre que les appels à la D.B.

Reply

Marsh Posté le 25-01-2018 à 16:32:49    

C'est un peu tout le problème du fonctionnement du mode PDO::FETCH_CLASS.
 
Solutions :
* rendre les paramètres du constructeur facultatifs (avec PDO ils ne seront pas renseignés)
* faire appel aux mutateurs quand c'est toi qui crée un objet
* sinon ne pas utiliser le mode PDO::FETCH_CLASS et instancier toi-même l'objet avec les paramètres qui vont bien


Message édité par pluj le 25-01-2018 à 16:33:23
Reply

Marsh Posté le 25-01-2018 à 16:42:22    

et bien merci pour ta réponse ... je fais la troisième solution et c'est un peu lourd ... je cherchais donc un truc plus automatique

Reply

Marsh Posté le 25-01-2018 à 16:56:40    

Concrètement tu pourrai m'écrire le code de la première ou deuxième solution ? (j'ai essayé professeur::class ça ne fonctionne pas non plus ... je suis en PHP7)
 
mutateurs ? j'ai essayé les getters et setters sans succès.  
 
Merci d'avance si tu peux encore m'aider.  
 

Reply

Marsh Posté le 26-01-2018 à 15:33:36    

Précision : je n'ai rien testé.
 
Ma proposition n°1 (rendre les paramètres du constructeur facultatifs) :

Code :
  1. class professeur {
  2.    public $nom;
  3.    public $prenom;
  4.  
  5.    public function __construct($nom = NULL, $prenom = NULL) {
  6.        if (!is_null($nom)) {
  7.            $this->nom = $nom;
  8.        }
  9.        if (!is_null($prenom)) {
  10.            $this->prenom = $prenom;
  11.        }
  12.    }
  13. }
  14.  
  15. # instanciation à la main :
  16. $prof = new professeur('Barre', 'Jean');
  17.  
  18. # PDO
  19. $bdd = new PDO(/* ... */);
  20. $professeurs = $bdd->query('SELECT * FROM professeurs ORDER BY nom, prenom')
  21.    ->fetchAll(PDO::FETCH_CLASS, professeur::class)
  22. ;


 
Ma proposition n°2 (instancier "à la main" une coquille vide pour ensuite appeler les mutateurs) :

Code :
  1. class professeur {
  2.    public $nom;
  3.    public $prenom;
  4.  
  5.    public function setNom($nom) {
  6.        $this->nom = $nom;
  7.        return $this;
  8.    }
  9.  
  10.    public function setPrenom($prenom) {
  11.        $this->prenom = $prenom;
  12.        return $this;
  13.    }
  14. }
  15.  
  16. # instanciation à la main :
  17. $prof = (new professeur())->setNom('Barre')->setPrenom('Jean');
  18.  
  19. # PDO (inchangé par rapport à ci-dessus)
  20. $bdd = new PDO(/* ... */);
  21. $professeurs = $bdd->query('SELECT * FROM professeurs ORDER BY nom, prenom')
  22.    ->fetchAll(PDO::FETCH_CLASS, professeur::class)
  23. ;


Message édité par pluj le 26-01-2018 à 17:24:24
Reply

Marsh Posté le 26-01-2018 à 16:37:55    

Merci beaucoup ... j'étais en train d'utiliser la méthode N°2 avec la coquille vide, ça marche bien.  
 
mais le coup des  
$prof->setNom('Barre')->setPrenom('Jean');
 
je connaissais pas
 
me sera très utile ;)
 
---
 
t'es sûr des "return $this" dans setNom et setPrenom ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed