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   -
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

labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour
Merci ça fonctionne à mercveille
    public static function ListeMembre() {
        self::init();
        $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>';
        }
    }

Tu peux me redonner quelques explications complémentaire à propos de cette fonction
self::init();
Je te remercie.
0
totodunet Messages postés 1377 Date d'inscription   Statut Membre Dernière intervention   200
 
pas de probleme,

$db est une variable statique déclarée dans ta classe. On appelle cela une variable de classe, comme les méthodes de classes qui sont elles des fonctions statiques. Mais $db est seulement déclarée! Elle n'est initialisée à new Database() que dès lors tu construis un objet de la classe dans laquelle elle est déclarée. Donc l'appel de la fonction init() se fait dans le constructeur de User. c'est pour cela que quand tu avais fais un new User() juste avant l'appel de la fonction ListeMembre() cela fonctionnait. Mais c'est idiot de construire un objet seulement pour initialiser une variable de classe. Car c'est pareil pour la fonction statique, $db n'est pas une variable intrinsèque à l'objet.

En fait ta fonction init() initialise ta variable $db mais regarde avant ça si elle n'était pas déjà justement initialisé. Car le problème c'est que si elle ne faisait pas de vérification, $db serait de renouveau initialisé à chaque fois que tu construis un nouvel objet User. En fait ce genre de variable statique, c'est utilisé généralement pour par exemple compter le nombre d'objet User que l'on construit. Mais là il ne s'agit pas d'un compteur donc ton code de la classe peut se simplifier à juste :

private static $db=new DataBase();

dans ta classe User

puis toujours dans la classe User, supprimer dans sa totalité la fonction init() ainsi que la ligne self::init() de ta fonction ListeMembre() et tous les appels à la fonction init() que tu peux trouver.

Mais ceci dit c'est juste pour faire plus propre et optimiser un peu le programme. Sinon ça fonctionne très bien comme ça aussi^^
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour
Merci pour tes explications très clair et pour tout en fait c'est super.
Cordialement.

PS J'aurai encore une lacune toujours avec POO concernant la modification de données, je ne sais pas si tu peux encore m'aider ou si j'ouvre un autre post.
Merci
0
totodunet Messages postés 1377 Date d'inscription   Statut Membre Dernière intervention   200
 
bonsoir,

pour modifier des attributs d'un objets qui sont déclarés en private dans la classe, on utilise des setters. ce sont des méthodes tel que setNom() ou setPrenom() par exemple qui affectent à l'attribut associé, la valeur mise en paramètre de la fonction. On profite du fait qu'elles puissent accéder et modifier les attributs. C'est donc le développeur de la classe qui décide de faire des setters si il juge que l'utilisateur peut modifier des attributs. Les getters eux sont des méthodes permettant de récupérer les attributs de la classe. Ils existent parce que les attributs sont déclarés en private, ceci est préféré pour des raisons de sécurité.
0

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

Posez votre question
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour
Merci,
en fait j'ai fait ceux-ci et je ne comprend pas pour ça marche pas encore quelque chose que je n'ai pas compris?
Mes méthodes de la class User
    public function setNom($nom) {
        $this->nom = trim($nom);
    }

public function update() {
         $req = self::$db->prepare('UPDATE tb_adherent SET nom = :nom WHERE id_adherent = :id_adherent');
        $req->bindParam(':id',              $this->id,              PDO::PARAM_INT);        
        $req->bindParam(':nom',             $this->nom,             PDO::PARAM_STR);
        $req->execute();
}

Ensuite dans la page de mon formulaire...
J'ai créé un nouvel objet et j'ai appelé la méthode update
$donnees = new User();
$donnees->update();

et le formulaire
value="<?php $donnees->setNom($nom);?>"
0
totodunet Messages postés 1377 Date d'inscription   Statut Membre Dernière intervention   200
 
bonjour,

dans le formulaire, l'attribut HTML value est la valeur du champ. Donc tu vas plutôt lui mettre le nom.

value="<?php $donnees->getNom();?>"


Qui ne tente rien n'a rien
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour,
Maintenant ça me retourne une erreur comme quoi je croisque c'est une histoire de paramètre
 Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in 
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
C'est encore moi une erreur de ma part pour cette erreur, donc maintenant aucune erreur mais les donnees ne se modifie pas.
0
totodunet Messages postés 1377 Date d'inscription   Statut Membre Dernière intervention   200
 
ah

peux tu me montrer ton bout de code HTML et PHP associé au traitement du formulaire ?
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour
Mon formulaire juste une partie
   <tr>
    <td width="20%">Nom :</td>
    <td width="30%"><input name="nom" size="30" type="text" value="<?php $donnees->getNom();?>"/></td>
    <td width="20%">Prénom :</td>
    <td width="30%"><input name="prenom" size="30" type="text" value="<?php $donnees->getNom();?>"/></td>
   </tr>

Je te donne toute la class User il y a la méthode "update"
<?php
    private $id_adherent;
    private $nom;
    private $prenom;
    private $email;
    private $naissance;
    private $fixe;
    private $mobile;
    private $adresse;
    private $lieu_dit;
    private $code_postal;
    private $ville;
    private $username;
    private $password;
    //private $hash_cookie;

    private static $db;

    public function __construct($id_adherent = null) {
        self::init();

        //is_int -- Détermine si une variable est de type nombre entier
        if(is_int($id_adherent)) {
            try {
            $this->load($id_adherent);
            }
            catch(Exception $e) {
            throw $e;
            }
        }
    }

    public function init() {
        if(self::$db == null) self::$db = new Database();
    }

    private function load($id_adherent) {
        $req = self::$db->prepare('SELECT * FROM tb_adherent WHERE id_adherent = :id_adherent');
        $req->bindParam(':id_adherent', $id_adherent, PDO::PARAM_INT);
        $req->execute();
        $donnees = $req->fetch(PDO::FETCH_ASSOC);

        if(empty($donnees)) throw new Exception('Utilisateur introuvable');
        $this->setUserDatas($donnees);
    }
##########################################################################################################################
    public function setNom($nom) {
        $this->nom = trim($nom);
    }
    public function setPrenom($prenom) {
        $this->prenom = trim($prenom);
    }    
    public function setEmail($email) {
        $this->email = trim($email);
    }    
    public function setNaissance($naissance) {
        $this->naissance = trim($naissance);
    }       
    public function setFixe($fixe) {
        $this->fixe = trim($fixe);
    }    
    public function setMobile($mobile) {
        $this->mobile = trim($mobile);
    }    
    public function setAdresse($adresse) {
        $this->adresse = trim($adresse);
    }    
    public function setLieuDit($lieu_dit) {
        $this->lieu_dit = trim($lieu_dit);
    }       
    public function setCodePostal($code_postal) {
        $this->code_postal = trim($code_postal);
    }    
    public function setVille($ville) {
        $this->ville = trim($ville);
    }     
    public function setUsername($username) {
        $this->username = trim($username);
    }   
    public function setPassword($password) {
        $this->password = trim($password);
    }   
    //public function setHashCookie($hash_cookie) {
    //    $this->hash_cookie = ($hash_cookie);
    //}
##########################################################################################################################
    public function getNom() {
        return $this->nom;
    }   
    public function getPrenom() {
        return $this->prenom;
    }
    public function getEmail() {
        return $this->email;
    }
    public function getNaissance() {
        return $this->naissance;
    }
    public function getFixe() {
        return $this->fixe;
    }
    public function getMobile() {
        return $this->mobile;
    }
    public function getAdresse() {
        return $this->adresse;
    }
    public function getLieuDit() {
        return $this->lieu_dit;
    }
    public function getCodePostal() {
        return $this->code_postal;
    }
    public function getVille() {
        return $this->ville;
    }  
    public function getUsername() {
        return $this->username;
    }
    public function getPassword() {
        return $this->password;
    }
##########################################################################################################################
    private function setUserDatas($donnees) {
        if(!empty($donnees) && is_array($donnees)) {
            $this->id_adherent      = $donnees['id_adherent'];
            $this->nom              = $donnees['nom'];
            $this->prenom           = $donnees['prenom'];
            $this->email            = $donnees['email'];
            $this->naissance        = $donnees['naissance'];
            $this->fixe             = $donnees['fixe'];
            $this->mobile           = $donnees['mobile'];
            $this->adresse          = $donnees['adresse'];
            $this->lieu_dit         = $donnees['lieu_dit'];
            $this->code_postal      = $donnees['code_postal'];
            $this->ville            = $donnees['ville'];
            $this->username         = $donnees['username'];
            $this->password         = $donnees['password'];
        }
    }    

    public static function get($username) {
        self::init();

        $req = self::$db->prepare('SELECT id_adherent FROM tb_adherent WHERE username = :username');
        $req->bindParam(':username', $username, PDO::PARAM_STR);
        $req->execute();

        $id_adherent = $req->fetchColumn();

        return ($id_adherent) ? new self((int) $id_adherent) : null;
    }

    public static function exists($username) {
        self::init();

        $username = trim($username);

        $req = self::$db->prepare('SELECT COUNT(*) FROM tb_adherent WHERE username = :username');
        $req->bindParam(':username', $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 = :username AND password = :password AND actif = 1');
        $req->bindParam(':username',           $this->username,        PDO::PARAM_STR);
        $req->bindParam(':password',           $this->password,        PDO::PARAM_STR);
        $req->execute();
        $donnees = $req->fetch(PDO::FETCH_ASSOC);

        $this->setUserDatas($donnees);

        return (!empty($donnees));
    }

    public function insert() {
        $req = self::$db->prepare('INSERT INTO tb_adherent (nom, prenom, email, naissance, fixe, mobile, adresse, lieu_dit, code_postal, ville, username, password) VALUES (:nom, :prenom, :email, :naissance, :fixe, :mobile, :adresse, :lieu_dit, :code_postal, :ville, :username, :password)');
        $req->bindParam(':nom',             $this->nom,             PDO::PARAM_STR);
        $req->bindParam(':prenom',          $this->prenom,          PDO::PARAM_STR);
        $req->bindParam(':email',           $this->email,           PDO::PARAM_STR);
        $req->bindParam(':naissance',       $this->naissance,       PDO::PARAM_STR);
        $req->bindParam(':fixe',            $this->fixe,            PDO::PARAM_STR);
        $req->bindParam(':mobile',          $this->mobile,          PDO::PARAM_STR);
        $req->bindParam(':adresse',         $this->adresse,         PDO::PARAM_STR);
        $req->bindParam(':lieu_dit',        $this->lieu_dit,        PDO::PARAM_STR);
        $req->bindParam(':code_postal',     $this->code_postal,     PDO::PARAM_STR);
        $req->bindParam(':ville',           $this->ville,           PDO::PARAM_STR);
        $req->bindParam(':username',        $this->username,        PDO::PARAM_STR);
        $req->bindParam(':password',        $this->password,        PDO::PARAM_STR);
        $req->execute();

        $req = self::$db->prepare('SELECT id_adherent FROM tb_adherent WHERE username = :username');
        $req->bindParam(':username', $this->username, PDO::PARAM_STR);
        $req->execute();

        $this->id_adherent = $req->fetchColumn();
    }    

    public function update() {
        $req = self::$db->prepare('UPDATE tb_adherent SET nom = :nom, prenom = :prenom, email = :email, naissance = :naissance, fixe = :fixe, mobile = :mobile, adresse = :adresse, lieu_dit = :lieu_dit, code_postal = :code_postal, ville = :ville, username = :username, password = :password WHERE id_adherent = :id_adherent');
        $req->bindParam(':id_adherent',     $this->id_adherent,     PDO::PARAM_INT);        
        $req->bindParam(':nom',             $this->nom,             PDO::PARAM_STR);
        $req->bindParam(':prenom',          $this->prenom,          PDO::PARAM_STR);
        $req->bindParam(':email',           $this->email,           PDO::PARAM_STR);
        $req->bindParam(':naissance',       $this->naissance,       PDO::PARAM_STR);
        $req->bindParam(':fixe',            $this->fixe,            PDO::PARAM_STR);
        $req->bindParam(':mobile',          $this->mobile,          PDO::PARAM_STR);
        $req->bindParam(':adresse',         $this->adresse,         PDO::PARAM_STR);
        $req->bindParam(':lieu_dit',        $this->lieu_dit,        PDO::PARAM_STR);
        $req->bindParam(':code_postal',     $this->code_postal,     PDO::PARAM_STR);
        $req->bindParam(':ville',           $this->ville,           PDO::PARAM_STR);
        $req->bindParam(':username',        $this->username,        PDO::PARAM_STR);
        $req->bindParam(':password',        $this->password,        PDO::PARAM_STR);
        $req->execute();
    }

    public static function ListeMembre() {
        self::init();

        $req = self::$db->prepare('SELECT * FROM tb_adherent WHERE actif = 1 ORDER BY nom, prenom ASC');
        $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>';
        }
    }
}    
0
totodunet Messages postés 1377 Date d'inscription   Statut Membre Dernière intervention   200
 
tu m'a pas montré ce qu'il fallait.
dans un formulaire HTML tu dois avoir la méthode d'envoi et l'action.

<form method="POST" action="updateUser.php">
     <input type="text" ... />
     <.../>
     <input type="submit" value="Mettre à jour"/>
</form>


puis pour récuperer la valeur que l'utilisateur à mis dans les textfields dans le script php pour le traitement, faut utiliser la variable $_POST. ou $_GET si la méthode d'envoi est get. Ces variables sont des tableaux associatifs par l'attribut name.

Qui ne tente rien n'a rien
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
en fait je n'ai pas mis tout le formulaire
 <form id="formulaire" action="" method="post">
  <fieldset>
  <legend class="legend">Modifier mon profil</legend>

  <table cellpadding="0" cellspacing="3">
   
   <tr>
    <th colspan="6">Coordonné :</th>
   </tr>
   <tr>
    <td width="20%">Nom :</td>
    <td width="30%"><input name="nom" size="30" type="text" value="<?php $donnees->getNom();?>"/></td>
    <td width="20%">Prénom :</td>
    <td width="30%"><input name="prenom" size="30" type="text" value="<?php $donnees->getNom();?>"/></td>
   </tr>
   <input type="submit" class="submit" value="Modifier"/>
  </fieldset>
 </form>
0
totodunet Messages postés 1377 Date d'inscription   Statut Membre Dernière intervention   200
 
ok donc il n'y a pas de problème côté HTML. est-ce que tu vois bien les champs remplies par défaut des noms et prénoms de l'objet ?

maintenant ton bout de code de ta même page avec $_POST pour le traitement du formulaire. il doit se trouver idéalement en début de page avant la première balise HTML que tu envoies au client.
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour,
Je ne comprends pas après avoir passé un bon moment.
Merci de ton aide.
Alors voilà ce que j'ai essayé de faire.
Pour le formulaire côté HTML les champs sont bien remplis avec
value="<?php echo $user->getNom();?>"

j'initialise les variables
cré un objet
affiche les setters pour pouvoir modifier
j'accéde à la méthode update
if(!empty($_POST)) {

    $nom = $_POST['nom'];
    $prenom = $_POST['prenom'];
    $email = $_POST['email'];    
    $username = $_POST['username'];

        $user = new User();

        $user->setNom($nom);
        $user->setPrenom($prenom);
  $user->setEmail($email);        
        $user->setUsername($username);
  
        $user->update(); 
} 
0
totodunet Messages postés 1377 Date d'inscription   Statut Membre Dernière intervention   200
 
bonsoir

les champs username et email n'existent pas dans ton formulaire HTML.

est-ce que tu as une erreur qui s'affiche après l'envoi du formulaire?

ce que je te conseille de faire,
c'est rajouter
echo $req;
juste avant la ligne
$req->execute();
dans ta fonction update() pour qu'il affiche la requête SQL et voir ce qu'il se passe. tu fais un copier-coller de ta requête dans ton SGBD et tu regardes ce qu'il te dit.

aussi pour vérifier $_POST il est bon d'utiliser la fonction isset() pour savoir si $_POST existe avant de voir si il est vide ou pas.

if(isset($_POST)&&!empty($_POST))




0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Voici l'erreur retournée
 Catchable fatal error: Object of class PDOStatement could not be converted to string in 
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour
Je t'envoie la totalité de mon formulaire.
Il y a quelques chose que je ne comprends pas c'est fou..
Donc ça me retourne l'erreur ci-dessus après avoir rajouté echo $req; comme tu me l'a dit sinon sans ça aucune erreur
<?php
if(isset($_POST)&&!empty($_POST)) {

    $nom = $_POST['nom'];
    $prenom = $_POST['prenom'];
    $email = $_POST['email'];    
    $username = $_POST['username'];

        $user = new User();

        $user->setNom($nom);
        $user->setPrenom($prenom);
		$user->setEmail($email);        
        $user->setUsername($username);
  
        $user->update(); 
}
?>
<div id="content">
	<form id="formulaire" action="" method="post">
		<fieldset>
		<legend class="legend">Modifier mon profil</legend>

		<table cellpadding="0" cellspacing="3">
			
			<tr>
				<th colspan="6">Coordonné :</th>
			</tr>
			<tr>
				<td width="20%">Nom :</td>
				<td width="30%"><input name="nom" size="30" type="text" value="<?php echo $user->getNom();?>"/></td>
				<td width="20%">Prénom :</td>
				<td width="30%"><input name="prenom" size="30" type="text" value="<?php echo $user->getPrenom();?>"/></td>
			<tr>
				<td width="20%"><img src="image/mail.png" alt="Email" title="Email" height="22" width="22"/> Adresse mail :</td>
				<td width="30%"><input name="email" class="content_input" size="30" type="text" value="<?php echo $user->getEmail();?>"/></td>
			</tr>
			<tr>
				<td width="20%"><img src="image/login.png" alt="Login" title="Login" height="22" width="22"/> Login :</td>
				<td width="30%"><input name="username" id="login_modif_membre"  class="content_input" onFocus="this.blur()" size="20" type="text" value="<?php echo $user->getUsername();?>"/></td>
			</tr>
		</table>

<!--#######################################################################################################################################-->

			
			<input type="submit" name="submit" class="submit" value="Enregistrer"/>
		</fieldset>
	</form>
</div>
0
totodunet Messages postés 1377 Date d'inscription   Statut Membre Dernière intervention   200
 
salut,

visiblement ta fonction update() semble problématique. As-tu fait un
echo $req;
comme je t'ai dit tans ta fonction update() pour voir ce qu'elle contient comme résultat et vérifier si elle ne comporte pas d'erreur SQL
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour
oui elle retourne l'erreur que je t'ai dit en fait
 Catchable fatal error: Object of class PDOStatement could not be converted to string in C

Merci
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour
Voilà je pense à quelque chose, il faudrait peut-être ajouter un SELECT dans la méthode UPDATE juste avant le update en fait je vais quand même essayer.
Je te redis qu'est ce qu'il en ressors....
Merci
0
labourette Messages postés 657 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour
Alors voilà j'ai fait ceux-ci dans la méthode update à priori ça enregistre dans la BDD
    public function update() {
        $req = self::$db->prepare('SELECT id_adherent FROM tb_adherent WHERE username = :username');
        $req->bindParam(':username', $this->username, PDO::PARAM_STR);
        $req->execute();
        $this->id_adherent = $req->fetchColumn();
        
        $req = self::$db->prepare('UPDATE tb_adherent SET nom = :nom, prenom = :prenom, email = :email, naissance = :naissance, fixe = :fixe, mobile = :mobile, adresse = :adresse, lieu_dit = :lieu_dit, code_postal = :code_postal, ville = :ville, username = :username, password = :password WHERE id_adherent = :id_adherent');
        $req->bindParam(':id_adherent',     $this->id_adherent,     PDO::PARAM_INT);        
        $req->bindParam(':nom',             $this->nom,             PDO::PARAM_STR);
        $req->bindParam(':prenom',          $this->prenom,          PDO::PARAM_STR);
        $req->bindParam(':email',           $this->email,           PDO::PARAM_STR);
        $req->bindParam(':naissance',       $this->naissance,       PDO::PARAM_STR);
        $req->bindParam(':fixe',            $this->fixe,            PDO::PARAM_STR);
        $req->bindParam(':mobile',          $this->mobile,          PDO::PARAM_STR);
        $req->bindParam(':adresse',         $this->adresse,         PDO::PARAM_STR);
        $req->bindParam(':lieu_dit',        $this->lieu_dit,        PDO::PARAM_STR);
        $req->bindParam(':code_postal',     $this->code_postal,     PDO::PARAM_STR);
        $req->bindParam(':ville',           $this->ville,           PDO::PARAM_STR);
        $req->bindParam(':username',        $this->username,        PDO::PARAM_STR);
        $req->bindParam(':password',        $this->password,        PDO::PARAM_STR);
        $req->execute();
    }

Mais voilà dans ma tête c'est pas clair du tout.
Déjà pourquoi dans le WHERE il n'y a pas plutôt
WHERE id_adherent= id_adherent');

si tu peux me donner des explications et en plus au niveau de l'affichage les donner modifier ne retourne pas dans le formulaire mais juste dans la BDD.
Merci beaucoup, j'y suis allé à taton si il y a autre chose de mieux au niveau requète.
0