Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1489 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2310422
stox
Posté le 25-01-2018 à 15:38:18  profilanswer
 

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.  

mood
Publicité
Posté le 25-01-2018 à 15:38:18  profilanswer
 

n°2310428
pluj
Posté le 25-01-2018 à 16:23:04  profilanswer
 

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
n°2310429
stox
Posté le 25-01-2018 à 16:28:45  profilanswer
 

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.

n°2310430
pluj
Posté le 25-01-2018 à 16:32:49  profilanswer
 

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
n°2310433
stox
Posté le 25-01-2018 à 16:42:22  profilanswer
 

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

n°2310435
stox
Posté le 25-01-2018 à 16:56:40  profilanswer
 

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.  
 

n°2310465
pluj
Posté le 26-01-2018 à 15:33:36  profilanswer
 

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
n°2310470
stox
Posté le 26-01-2018 à 16:37:55  profilanswer
 

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 ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Php.ini changement non pris en compteRécupérer date et heure de modification de dossier dans FTP
Rendre invisible un lien avec PHP[VBA Excel] Recuperer une couleur mise en forme par condition
Écrire dans un fichier qui est en cours de lecture[HTML/CSS][PHP][JS][SQL] Quelques bon livres ?
[Ajax] Récupèrer l'action lors d'événement après rechargement de pagePHP <IMG> Vérifier l'existence de l'image
PHP - Eclaircir une couleurPSCS et PHP
Plus de sujets relatifs à : récupérer collection d'objets en PHP depuis une D.B.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR