Programmation Orienté Objet
Résolulabourette Messages postés 670 Statut Membre -
Je débute en POO et je souhaiterai pouvoir afficher tous les membres, pouvez vous m'aider un peu en me donnant quelques explications un peu détaillé s'ils vous plait.
J'ai ma class User, avec quelques méthodes, le systéme de connexion est fait j'affiche les infos du membre connecté comme ceux-ci.
<td><?php echo $user->getNom(); ?></td>
Et pour afficher tous les membres vous pouvez me donner quelques explications, car je nage malgrès beaucoup de lecture de tutos sur le sujet, mais en ayant des exemple concret j'y verrai plus clair.
En vous remerciant beaucoup.
47 réponses
- 1
- 2
- 3
Afficher tous les membres en PHP avec une classe User nécessite une récupération des données et leur affichage sous forme de lignes HTML, tout en restant cohérent avec l’approche orientée objet. Des options existent, notamment récupérer les données avec PDO et fetchAll puis les parcourir, ou obtenir directement des objets User via fetchObject('User'), en veillant à utiliser les getters comme getNom() et getEmail(). En pratique, certaines solutions proposent une méthode statique ListeMembre() dans la classe User pour interroger la base et retourner les objets, évitant l’utilisation d’un nouvel objet pour chaque ligne. D'autres approches insistent sur l'importance d'appeler les getters sur chaque instance et de tester les données côté POST lors des mises à jour pour prévenir des erreurs.
-
j'aurais plutôt récupérer toutes les données d'un coup puis ensuite parcourir la table
$donnees=$req->fetchAll(PDO::FETCH_ASSOC); for(i=0;i<count($donnees);i++){ echo '<tr>'; echo '<td><'.$donnees[i]['nom'].'></td>'; echo '<td><'.$donnees[i]['prenom'].'></td>'; echo '<td><'.$donnees[i]['email'].'></td>'; echo '</tr>'; }
méfies toi, $donnees n'etait pas un objet de la class User mais un tableau associatif et donc tu ne pouvait pas y appeler des méthodes.
si tu veux que PDO te renvoie un objet de la classe User tu peux faire ça :
$donnees=$req->fetchObject('User');
après ça reste une solution parmi d'autres
Qui ne tente rien n'a rien -
salut
je ne connais pas la structure de ta classe mais ce que tu veux là ça sent la boucle for. tu veux parcourir un à un les utilisateurs et les afficher. le tout étant de savoir où et dans quoi sont stockés tes utilisateurs
-
Bonjour
En fait j'ai ma class Userclass User { private $id; private $nom; private $prenom; private $email; private $username; private $password; private $hash; private static $db; public function __construct($id = null) { self::init(); //is_int -- Détermine si une variable est de type nombre entier if(is_int($id)) { try { $this->load($id); } catch(Exception $e) { throw $e; } } } public function init() { if(self::$db == null) self::$db = new Database(); } private function load($id) { $req = self::$db->prepare('SELECT * FROM tb_adherent WHERE id = :id'); $req->bindParam(':id', $id, PDO::PARAM_INT); $req->execute(); $d = $req->fetch(PDO::FETCH_ASSOC); if(empty($d)) throw new Exception('Utilisateur introuvable'); $this->setUserDatas($d); } public function setNom($nom) { $this->nom = trim($nom); } public function getNom() { return $this->nom; } public function setPrenom($prenom) { $this->prenom = trim($prenom); } public function getPrenom() { return $this->prenom; } public function setEmail($e) { $this->email = trim($e); } public function getEmail() { return $this->email; } public function setUsername($u) { $this->username = trim($u); } public function getUsername() { return $this->username; } public function setPassword($p) { $this->password = trim($p); } public function getPassword() { return $this->password; } public function setHash($h) { $this->hash = $h; } private function setUserDatas($d) { if(!empty($d) && is_array($d)) { $this->id = $d['id']; $this->nom = $d['nom']; $this->prenom = $d['prenom']; $this->email = $d['email']; $this->username = $d['username']; $this->password = $d['password']; } } public function checkHash($hash) { return $this->hash == $hash; } public static function get($username) { self::init(); $req = self::$db->prepare('SELECT id_adherent FROM tb_adherent WHERE username = :u'); $req->bindParam(':u', $username, PDO::PARAM_STR); $req->execute(); $id = $req->fetchColumn(); return ($id) ? new self((int) $id) : null; } public static function exists($username) { self::init(); $username = trim($username); $req = self::$db->prepare('SELECT COUNT(*) FROM tb_adherent WHERE username = :user'); $req->bindParam(':user', $username, PDO::PARAM_STR); $req->execute(); $count = $req->fetchColumn(); return ($count == 0) ? false : true; } public function login() { $req = self::$db->prepare('SELECT * FROM tb_adherent WHERE username = :u AND password = :p'); $req->bindParam(':u', $this->username, PDO::PARAM_STR); $req->bindParam(':p', $this->password, PDO::PARAM_STR); $req->execute(); $d = $req->fetch(PDO::FETCH_ASSOC); $this->setUserDatas($d); return (!empty($d)); } public function save() { $req = self::$db->prepare('INSERT INTO tb_adherent (nom, prenom, email, username, password) VALUES (:nom, :prenom, :e, :u, :p)'); $req->bindParam(':nom', $this->nom, PDO::PARAM_STR); $req->bindParam(':prenom', $this->prenom, PDO::PARAM_STR); $req->bindParam(':e', $this->email, PDO::PARAM_STR); $req->bindParam(':u', $this->username, PDO::PARAM_STR); $req->bindParam(':p', $this->password, PDO::PARAM_STR); $req->execute(); $req = self::$db->prepare('SELECT id_adherent FROM tb_adherent WHERE username = :u'); $req->bindParam(':u', $this->username, PDO::PARAM_STR); $req->execute(); $this->id = $req->fetchColumn(); } public function update() { $req = self::$db->prepare('UPDATE tb_adherent SET nom = :nom, prenom = :prenom, username = :u, email = :e, password = :p WHERE id = :id'); $req->bindParam(':id', $this->id, PDO::PARAM_INT); $req->bindParam(':nom', $this->nom, PDO::PARAM_STR); $req->bindParam(':prenom', $this->prenom, PDO::PARAM_STR); $req->bindParam(':e', $this->email, PDO::PARAM_STR); $req->bindParam(':u', $this->username, PDO::PARAM_STR); $req->bindParam(':p', $this->password, PDO::PARAM_STR); $req->execute(); } }
ensuite j'ai mon fichiet listeMembre ou je souhaite afficher tous les membres
j'ai fait j'ai essayé de faire ça peux tu me dire comment je pourrais faire.
Merci beaucoup
.<div id="ListeMembre"> <table id="user_list" cellpadding="0" cellspacing="1"> <tr> <th width="30%">Nom</th> <th width="30%">Prénom</th> <th width="40%">Email</th> </tr> <?php while($donnees = $req -> fetch(PDO::FETCH_ASSOC)) { ?> <tr> <td><?php echo $donnees->nom; ?></td> <td><?php echo $donnees->prenom; ?></td> <td><?php echo $donnees->email; ?></td> </tr> <?php } ?> </table> </div> -
Bonjour
Déjà merci pour ton aide.
Malheureusement ça ne fonctionne pas.
Alors voilà j'ai créé une méthod dans la class User. A partir de mon fichier Membre j'aurai souhaité appelé cette méthod pour afficher les membres.
Ma fonction est-elle correct, ensuite pour l'appel à cette fonction je voyais un truc du genre...$d = new User(); $d->ListeMembre($id);
public function ListeMembre($id) { $req = self::$db->prepare('SELECT * FROM tb_adherent WHERE id = :id'); $req->bindParam(':id', $id, PDO::PARAM_INT); $req->execute(); while($d = $req -> fetch(PDO::FETCH_ASSOC)) { $this->nom = $d['nom']; $this->prenom = $d['prenom']; $this->email = $d['email']; $this->fixe = $d['fixe']; $this->mobile = $d['mobile']; } }
Merci vraiment de ton aide -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
oui ça ne marche pas car j'ai omis de mettre les $ derrière ma variable i
for($i=0;$i<count($donnees);$i++){ echo "<tr>"; echo "<td><".$donnees[$i]['nom']."></td>"; echo "<td><".$donnees[$i]['prenom']."></td>"; ...
ton truc pourrait marcher mais l'inconvénient et de devoir justement utiliser un objet pour afficher d'autres objets de sa même instance. La preuve, tu as créer un objet User uniquement pour pouvoir afficher la liste. ou bien tu fais une fonction dite "statique" dans la classe User, comme ça tu n'a pas à utiliser d'objet et tu l'appelle directement par :
User::ListeMember($id);
mais ce que tu venais de faire tout au début était très bien aussi. tu as juste à remplacer dans ton while
while($donnees = $req -> fetch(PDO::FETCH_ASSOC))
par
while($donnees = $req -> fetchObject('User'))
et aussi que tu accèdes aux attributs par tes getters que tu as créé dans ta classe (sinon ils servent à rien^^) car tu ne peux pas accéder directement à l'attribut nom par exemple en faisant :
$donnees->nom
car nom est private
il faut faire$donnees->getNom()
Qui ne tente rien n'a rien -
Bonjour
voici ce que j'ai fait et me retourne des erreurs
ma méthod dans la page classpublic static function ListeMembre($id) { $req = self::$db->prepare('SELECT * FROM tb_adherent WHERE id = :id'); $req->bindParam(':id', $id, PDO::PARAM_INT); $req->execute(); while($d = $req -> fetchObject('User')) { $this->id = $d['id']; $this->nom = $d['nom']; $this->prenom = $d['prenom']; $this->email = $d['email']; $this->fixe = $d['fixe']; $this->mobile = $d['mobile']; } }
mon appel à cette fonction est dans mon fichier ListeMembre.php<?php User::ListeMember($id); ?> <tr> <td><?php echo $d->getNom(); ?></td> <td><?php echo $d->getPrenom(); ?></td> <td><?php echo $d->getEmail(); ?></td> </tr>
Merci pour tes explications et bien entendu ton aide, parce que je commence à comprendre certaines choses mais pour le mettre en pratique c'est une autre histoire. -
ce que je te propose si tu tiens à ta fonction ListeMember :
public static function ListeMembre($id) { $req = self::$db->prepare('SELECT * FROM tb_adherent WHERE id = :id'); $req->bindParam(':id', $id, PDO::PARAM_INT); $req->execute(); while($d = $req -> fetchObject('User')) { echo '<tr>'; echo '<td>'.$d->getNom().'</td>'; echo '<td>'.$d->getPrenom().'</td>'; echo '<td>'.$d->getEmail().'</td>'; echo '</tr>'; } }
puis tu appelles ta fonction dans ta page :
<?php User::ListeMember($id);?>
au fait c'est quoi l'attribut id, parce que si c'est un numéro unique pour chaque instance, il est normal qu'il y aura qu'une ligne au résultat
-
Bonjour,
youpi super ça marche un très grand merci.
Je ne sais pas si c'est une des meilleures façon mais ça fonctionne comme ça.public static function ListeMembre() { $req = self::$db->prepare('SELECT * FROM tb_adherent'); $req->bindParam(':id', $id, PDO::PARAM_INT); $req->execute(); while($d = $req -> fetchObject('User')) { echo '<tr>'; echo '<td>'.$d->getNom().'</td>'; echo '<td>'.$d->getPrenom().'</td>'; echo '<td>'.$d->getEmail().'</td>'; echo '</tr>'; } }
appel de la fonction<div id="ListeMembre"> <table id="user_list" cellpadding="0" cellspacing="1"> <tr> <th width="30%">Nom</th> <th width="30%">Prénom</th> <th width="40%">Email</th> </tr> <?php $d = new User(); User::ListeMembre(); ?> </table> </div>
Merci -
salut,
c'est très bien. pour simplifier tu peux enlever la ligne inutile
$req->bindParam car tu te fiches de l'id dans ta requête sql
et pourquoi tu crées un nouvel objet User d ? Le principe de la fonction statique c'est que justement tu n'a pas à créer d'objet pour l'utiliser. On appelle ça une méthode de classe.
-
Bonjour
Peux tu me donner un peu des explications afin d'éviter de créer le nouvel objet ça serai vraiment mieux. J'ai regardé quelques tutos j'ai du mal à saisir les explications données.
Merci -
en gros tu enlèves juste la ligne
$d=new User();
tu vois que $d tu ne vas pas l'utiliser après.
quelques explications :
getNom() par exemple est une méthode dans ta classe qui a pour but de renvoyer le nom de l'objet. Seulement pour renvoyer le nom de l'objet, il faut qu'il ait l'objet en question donc :
$d->getNom();
c'est une méthode qui n'ait pas statique car elle lui faut un objet pour qu'elle puisse fonctionner (normal^^)
Maintenant ta fonction ListeMembre() elle est statique. Elle est déclarée dans ta classe User, c'est un outil qu'offre ta classe. Son rôle est d'effectuer une requête SQL et de renvoyer toutes les informations des objets User stockés dans ta BDD. Seulement elle à la différence de getNom(), elle n'a pas besoin d'objet. c'est pas une méthode intrinsèque à l'objet. Elle reste toutefois définie dans ta classe, c'est une méthode de classe. D'ailleurs elle peut accéder directement aux attributs sans faire appel aux getters. donc ceci reste valable :
public static function ListeMembre() { $req = self::$[/contents/372-fichier-db db]->prepare('[/contents/1068-sql-commande-select SELECT] * FROM tb_adherent'); $req->execute(); while($d = $req -> fetchObject('User')) { echo '<tr>'; echo '<td>'.$d->nom.'</td>'; echo '<td>'.$d->prenom.'</td>'; echo '<td>'.$d->email.'</td>'; echo '</tr>'; } }
je t'avais dit d'utiliser des getters dans le cas du tout début où tu avais fait une boucle while extérieure à ta classe.
est-ce claire ou c'est un peu flou ?
n'hésites pas si tu as des remarques et questions, c'est un plaisir de répondre.
-
Bonjour
Tes explications sont nettement très clair quelques petits soucis néanmoins pour la compréhension de cette ligne déjà...$req = self::$[/contents/372-fichier-db db]->prepare('[/contents/1068-sql-commande-select SELECT] * FROM tb_adherent');
Ensuite j'ai une erreurParse error: syntax error, unexpected '[', expecting T_VARIABLE or '$' in C..
-
c'est syntaxiquement incorrect
je sais pas ce qui s'est passé au copier coller, désolé j'avais pas relu. ça reste en fait$req = self::$db->prepare('SELECT * FROM tb_adherent');
-
j'ai cette erreur
Fatal error: Call to a member function prepare() on a non-object in C
?? -
ah étrange. précédemment tu avais dit que ça fonctionnait. elle est déclaré où ta variable $db ?
-
en fait si j'enlève cette ligne avec cette boucle
$d = new User();
while($d = $req -> fetchObject('User')) { echo '<tr>'; echo '<td>'.$d->nom.'</td>'; echo '<td>'.$d->prenom.'</td>'; echo '<td>'.$d->email.'</td>'; echo '</tr>';
ça retourne cette erreurFatal error: Call to a member function prepare() on a non-object in C
sinon avec cette ligne oui effectivement ça marche puis en faisant cette bouclewhile($d = $req -> fetchObject('User')) { echo '<tr>'; echo '<td>'.$d->getNom().'</td>'; echo '<td>'.$d->getPrenom().'</td>'; echo '<td>'.$d->getEmail().'</td>'; echo '</tr>'; -
variable $db est
au début de la class Userprivate $id; private $nom; private $prenom; private $email; private $fixe; private $mobile; private $username; private $password; private $hash; private static $db; -
ok donc rien à voir avec $db visiblement
essaies ceci :
$req=$req->execute(); while($d=$req->fetchObject('User')){ .. }
sinon bah dans ce cas laisses la ligne $d=new User() même si là j'avoue ne plus comprendre^^
à moins qu'il faut déclarer $d avant l'entrée dans la boucle while
-
Bonjour
Non toujours pas désolé, je te met exactement ma méthode et mon appel si au cas où..
la méthode de mon objet Userpublic static function ListeMembre() { $req = self::$db->prepare('SELECT * FROM tb_adherent WHERE actif = 1'); $req->execute(); while($donnees = $req -> fetchObject('User')) { echo '<tr>'; echo '<td>'.$donnees->nom.'</td>'; echo '<td>'.$donnees->prenom.'</td>'; echo '<td>'.$donnees->email.'</td>'; $tel1 = $donnees->fixe; $tel1 = wordwrap ($tel1, 2, ' ', 1); echo '<td>'.$tel1.'</td>'; $tel2 = $donnees->mobile; $tel2 = wordwrap ($tel2, 2, ' ', 1); echo '<td>'.$tel2.'</td>'; echo '</tr>'; } }
mon appel à cette fonction<div id="ListeMembre"> <table id="user_list" cellpadding="0" cellspacing="1"> <tr> <th width="20%">Nom</th> <th width="20%">Prénom</th> <th width="20%">Email</th> <th width="20%">Téléphone Fixe</th> <th width="20%">Téléphone Mobile</th> </tr> <?php User::ListeMembre(); ?> </table> </div>
mon erreur retournéFatal error: Call to a member function prepare() on a non-object in C:
sinon si je cré un nouvel objet ça fonctionne<div id="ListeMembre"> <table id="user_list" cellpadding="0" cellspacing="1"> <tr> <th width="20%">Nom</th> <th width="20%">Prénom</th> <th width="20%">Email</th> <th width="20%">Téléphone Fixe</th> <th width="20%">Téléphone Mobile</th> </tr> <?php $donnees = new User(); User::ListeMembre(); ?> </table> </div>
Merci beaucoup -
ah ça y est j'ai compris. $donnees devait être le tout premier objet User que tu as créees dans ta page. du coup si tu mettais pas cette ligne, l'attribut $db qui est statique n'existait pas. et donc ta fonction listemembre() lui est impossible de faire un prepare() dessus.
pour combler à ça, il faudrait utiliser ta fonction init() dans ListeMembre qui regarde avant si $db existe bien ou si il doit le créer
public static function ListeMembre() { init(); $req = self::$db->prepare('SELECT * FROM tb_adherent WHERE actif = 1'); $req=$req->execute(); while($donnees = $req -> fetchObject('User')) { echo '<tr>'; echo '<td>'.$donnees->nom.'</td>'; echo '<td>'.$donnees->prenom.'</td>'; echo '<td>'.$donnees->email.'</td>'; $tel1 = $donnees->fixe; $tel1 = wordwrap ($tel1, 2, ' ', 1); echo '<td>'.$tel1.'</td>'; $tel2 = $donnees->mobile; $tel2 = wordwrap ($tel2, 2, ' ', 1); echo '<td>'.$tel2.'</td>'; echo '</tr>'; } }
Qui ne tente rien n'a rien
- 1
- 2
- 3