Programmation Orienté Objet

Résolu
labourette Messages postés 670 Statut Membre -  
labourette Messages postés 670 Statut Membre -
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.
<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
Résumé de la discussion

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.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. totodunet Messages postés 1513 Statut Membre 201
     
    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
    1
  2. totodunet Messages postés 1513 Statut Membre 201
     
    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
    0
  3. labourette Messages postés 670 Statut Membre 6
     
    Bonjour
    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>
    
    0
  4. labourette Messages postés 670 Statut Membre 6
     
    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
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. totodunet Messages postés 1513 Statut Membre 201
     
    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
    0
  7. labourette Messages postés 670 Statut Membre 6
     
    Bonjour
    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.
    0
  8. totodunet Messages postés 1513 Statut Membre 201
     
    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

    0
  9. labourette Messages postés 670 Statut Membre 6
     
    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
    0
  10. totodunet Messages postés 1513 Statut Membre 201
     
    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.
    0
  11. labourette Messages postés 670 Statut Membre 6
     
    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
    0
  12. totodunet Messages postés 1513 Statut Membre 201
     
    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.
    0
  13. labourette Messages postés 670 Statut Membre 6
     
    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 erreur
     Parse error: syntax error, unexpected '[', expecting T_VARIABLE or '$' in C..
    
    0
  14. totodunet Messages postés 1513 Statut Membre 201
     
    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');


    0
  15. labourette Messages postés 670 Statut Membre 6
     
    j'ai cette erreur
    Fatal error: Call to a member function prepare() on a non-object in C
    ??
    0
  16. totodunet Messages postés 1513 Statut Membre 201
     
    ah étrange. précédemment tu avais dit que ça fonctionnait. elle est déclaré où ta variable $db ?
    0
  17. labourette Messages postés 670 Statut Membre 6
     
    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 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>';
    
    0
  18. labourette Messages postés 670 Statut Membre 6
     
    variable $db est
    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;
    
    0
  19. totodunet Messages postés 1513 Statut Membre 201
     
    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
    0
  20. labourette Messages postés 670 Statut Membre 6
     
    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
        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
    0
  21. totodunet Messages postés 1513 Statut Membre 201
     
    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
    0
  • 1
  • 2
  • 3