Programmation Orienté Objet

Résolu/Fermé
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 - 25 oct. 2014 à 18:59
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 - 7 nov. 2014 à 06:26
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

totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
Modifié par totodunet le 26/10/2014 à 14:35
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
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
25 oct. 2014 à 23:28
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
26 oct. 2014 à 00:00
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
26 oct. 2014 à 17:51
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
Modifié par totodunet le 26/10/2014 à 19:22
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
26 oct. 2014 à 23:19
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
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
26 oct. 2014 à 23:59
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
27 oct. 2014 à 13:51
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
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
27 oct. 2014 à 14:15
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
27 oct. 2014 à 17:57
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
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
27 oct. 2014 à 19:40
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
27 oct. 2014 à 20:07
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
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
27 oct. 2014 à 21:07
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
27 oct. 2014 à 21:22
j'ai cette erreur
Fatal error: Call to a member function prepare() on a non-object in C
??
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
27 oct. 2014 à 21:26
ah étrange. précédemment tu avais dit que ça fonctionnait. elle est déclaré où ta variable $db ?
0
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
Modifié par labourette le 27/10/2014 à 22:47
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
27 oct. 2014 à 22:25
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
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
28 oct. 2014 à 00:06
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
Modifié par labourette le 28/10/2014 à 09:32
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
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
Modifié par totodunet le 28/10/2014 à 11:35
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