Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PDO] function fetch() on a non-object

Sujet résolu
    26 novembre 2011 à 15:26:24

    Salut tout le monde,

    J'ai un petit soucis sur le site web que je suis en train de construire.
    J'ai fait une classe Membre qui correspond à ma table Membre dans ma base de données (MySQL).
    Dans cette classe j'ai fait une fonction pour se connecter appelée chercherSession($mail,$mdp)
    avec $mail l'adresse mail de l'utilisateur (ia pas de login prévu ^^) et $mdp bah ... le mot de passe ^^

    Voici le code de ma fonction :
    public static function chercherSession($mail,$mdp){
      $pass = md5($mdp);			
      $sql="SELECT * FROM Membre WHERE MailMembre=:mail";	
      $r=DB::get_instance()->prepare($sql);  */on prépare la requête*/
      $r=$r->execute(array(':mail'=>$mail));
    
      while ($m= $r->fetch()){
        if($pass == $m[4]) 	/*on vérifie la cohérence du mdp */
          return new Membre($m[1],$m[2],$m[3],$m[4],$m[5],$m[6],$m[7],$m[8],$m[9],$m[10],$m[11],$m[12],$m[0]);		
      }			
    }
    


    Et c'est là que mon soucis apparait : lorsque je tente de me connecter, j'appelle donc cette fonction
    et j'en obtiens ce message d'erreur :
    Fatal error: Call to a member function fetch() on a non-object in chemin\Membre.class.php on line 7

    J'ai vu sur internet que ce problème pouvait venir de ma requête mais même en simplifiant la requête pour tester (en mettant juste SELECT * FROM Membre), j'obtiens la même erreur.

    Quelqu'un saurait-il m'aider ? :(
    • Partager sur Facebook
    • Partager sur Twitter
      26 novembre 2011 à 16:42:00

      Il faut écrire :
      $r->execute(array(':mail'=>$mail));
      

      Et non :
      $r=$r->execute(array(':mail'=>$mail));
      

      Puisque $r est déjà un objet PDOStatement et que la méthode execute retourne un booléen (d'où l'erreur en cherchant à appeler une méthode fetch à partir d'un booléen au lieu d'un objet).

      PS :
      - pourquoi comparer le mot de passe en PHP ? Il suffit d'ajouter AND champMotDePasse = MD5(:mdp) et de binder $mdp à :mdp si on réalise le md5 avec MySQL sinon avec PHP, c'est pareil (AND champMotDePasse = :mdp en bindant md5($mdp) à :mdp). C'est bien plus propre/cohérent de l'avoir en critère de la requête.
      - pourquoi réécrire ce que propose PDO en plus "propre" ? (je pense au mode PDO::FETCH_CLASS notamment)
      • Partager sur Facebook
      • Partager sur Twitter
        26 novembre 2011 à 17:57:27

        Oui, au niveau du premier PS, c'est ce que je faisais mais vu que ça bugait, j'ai essayé d'autres choses mais à la base, c'est ce que j'avais fait ^^
        Pour le PS2, je connaissais pas PDO::FETCH_CLASS. Je vais me renseigner pour voir ce que c'est =) Je suppose que ça doit me fait un tableau contenant des classes.

        Et sinon ... Wouhouuuu ! ça maaaarche ! :D
        Ça faisait quelques jours que je cherchais vainement ^^"

        Merci Julp ! ;)
        • Partager sur Facebook
        • Partager sur Twitter
          26 novembre 2011 à 18:14:26

          Citation : neomomo60

          Pour le PS2, je connaissais pas PDO::FETCH_CLASS. Je vais me renseigner pour voir ce que c'est =) Je suppose que ça doit me fait un tableau contenant des classes.


          Avec fetch(Object) : un seul objet
          Avec fetchAll : un tableau d'objets

          Dans ce mode, par défaut, PDO initialise un objet de classe désirée, assigne à chaque attribut portant le même nom que la colonne, la valeur correspondante (s'ils n'existent pas, il en fait un attribut public) puis appelle le constructeur (je sais, ça peut paraître bizarre ; pour l'inverse, avec une version >= 5.2.0, pour d'abord appeler le constructeur il faut ajouter l'option PDO::FETCH_PROPS_LATE par un ou bit binaire - opérateur |).

          L'avantage, c'est que l'instanciation et initialisation des membres sont transparents et automatiques. Par contre, l'inconvénient majeur c'est qu'il faut garder la classe synchronisée sur la structure de la table et respecter le schéma (puisque leurs noms sont ceux des colonnes).
          • Partager sur Facebook
          • Partager sur Twitter

          [PDO] function fetch() on a non-object

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown