Programmation Orienté Objet
Résolu
labourette
Messages postés
657
Date d'inscription
Statut
Membre
Dernière intervention
-
labourette Messages postés 657 Date d'inscription Statut Membre Dernière intervention -
labourette Messages postés 657 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
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.
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.
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.
A voir également:
- Programmation Orienté Objet
- Application de programmation - Guide
- Vente objet occasion entre particulier - Guide
- Objet interdit en cabine ryanair - Guide
- Identifier un objet à partir d'une photo - Guide
- Mesurer un objet - Guide
47 réponses
j'aurais plutôt récupérer toutes les données d'un coup puis ensuite parcourir la table
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
$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
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 User
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
.
En fait j'ai ma class User
class 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...
Merci vraiment de ton aide
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
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
par
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 :
car nom est private
il faut faire
Qui ne tente rien n'a rien
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 class
mon appel à cette fonction est dans mon fichier ListeMembre.php
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.
voici ce que j'ai fait et me retourne des erreurs
ma méthod dans la page class
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')) { $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 :
puis tu appelles ta fonction dans ta page :
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
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.
appel de la fonction
Merci
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.
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
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
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 :
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 :
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.
$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à...
Ensuite j'ai une erreur
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 erreur
Parse 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
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');
en fait si j'enlève cette ligne avec cette boucle
ça retourne cette erreur
sinon avec cette ligne oui effectivement ça marche puis en faisant 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 erreur
Fatal 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 boucle
while($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 User
au début de la class User
private $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 :
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
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 User
mon appel à cette fonction
mon erreur retourné
sinon si je cré un nouvel objet ça fonctionne
Merci beaucoup
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 User
public 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
Qui ne tente rien n'a rien
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