Partage
  • Partager sur Facebook
  • Partager sur Twitter

Login et mot de passe PHP Mysql

Call to a member function fetch() on a non-object

Sujet résolu
    3 octobre 2010 à 22:52:56

    Bonjour (enfin Bonsoir :) ),
    Je code un site un une page récupère le login et le mot de passe et une autre page qui vas comparer celui du formulaire de la page1 et de ceux de la base de données.
    La page1 s'appele "index.php" et la 2 "testlog.php"
    J'ai uploadé la première page ici : Voici la page 1
    Pour la page 2, comme je n'ai pas uploadés ma base de donnée je vous passe juste le code :
    <?php
    // Je me connecte à la base de données
    try
    {
        $bdd = new PDO('mysql:host=localhost;dbname=log', 'root', '');
    }
    catch (Exception $e) // Si erreur
    {
            die('Erreur : ' . $e->getMessage());
    }
    
    
    //Je choisis le champ login
    $reponse_login = $bdd->query('SELECT login FROM login'); // Je choisis de la base de donné login le champ login
    $reponse_password = $bdd->query('SELECT login FROM password'); // Je choisis de la base de donné login le champ password
    
    //Je vérifie tout mes champs logins
    while ($donnees = $reponse_login->fetch() AND $donees2 = $reponse_password->fetch()) // ICI INTERVIENT L'ERREUR!!!!!!!
    {
        if ($_POST['login'] == $donnees['login'] AND $_POST['password'] == $donnees['password']) // Si mon login et password du formulaire == login et password de la base de données alors :
        {
            // La suite de mon code qui y sera après que je n'ai plus d'erreur et pour l'instant c'est :
            echo "Ouais!!!!!! J'ai plus d'érreur!!!! ( C'EST BEAU LES REVES !)" ;
        }
    }
    $reponse_login->closeCursor(); // Termine le traitement de la requête
    $reponse_password->closeCursor(); // Termine le traitement de la requête
    
    
    ?>
    


    Voili voulou.
    Et l'erreur est :
    Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\seconnecter\testlog.php on line 18


    Pour la base de données j'ai fait un screenshort pour se rassurer que le nom de la base est juste :
    Image utilisateur

    C'est fini!!!
    Je vous remercie infiniment de votre futur aide !
    MERCI!
    • Partager sur Facebook
    • Partager sur Twitter
      3 octobre 2010 à 23:00:43

      Salut.
      Regarde si $reponse_login et $reponse_password contiennent quelquechose par l'intermédiaire de la fonction isset($variable)
      • Partager sur Facebook
      • Partager sur Twitter

      Autrefois ceci était plein, et maintenant c'est bien vide. Le SdZ me manque.

        3 octobre 2010 à 23:20:06

        D'accord. Je voit ou tu veux en venir mais je ne sais pas ou le mettre dans le code :'(
        Peux tu me corriger mon code et le copier coller sur le forum.
        MERCI !
        • Partager sur Facebook
        • Partager sur Twitter
          3 octobre 2010 à 23:27:20

          Réfléchis un tout petit peu ;)
          Tu déclares $reponse_login et $reponse_password, puis tu fais le test avec une condition.
          Si la condition est remplie tu fais ton while, sinon t'affiches un message d'erreur.
          • Partager sur Facebook
          • Partager sur Twitter

          Autrefois ceci était plein, et maintenant c'est bien vide. Le SdZ me manque.

            3 octobre 2010 à 23:30:24

            Tu veux faire quoi? Une vérification de mot de passe?
            L'utilisateur rentre un login et un mot de passe?
            Est ce que le mot de passe est différent pour chaque utilisateur?

            Désolé de toutes ces questions mais c'est pour mieux cerner ton problèmes et pouvoir t'aider. ;)
            • Partager sur Facebook
            • Partager sur Twitter
              3 octobre 2010 à 23:38:50

              @leo48: Débuggage.
              Je pense que ses variables qu'il récupère de MySQL sont vides.
              Mais bon, il s'est inscrit hier, il faut qu'il apprenne à pratiquer :p
              En tous cas, tu t'y prends bien, drouchek, tu es un des premiers nouveaux que je vois qui donnent tout le code, des screens et tout ... :)
              • Partager sur Facebook
              • Partager sur Twitter

              Autrefois ceci était plein, et maintenant c'est bien vide. Le SdZ me manque.

                3 octobre 2010 à 23:45:49

                Justement je trouve que son système est mal construit pour faire une vérification de mot de passe.

                Après relecture du code les requêtes sont :
                SELECT login FROM login
                SELECT password FROM login
                


                Et non :
                SELECT login FROM login
                SELECT login FROM password
                


                Même si ça ne change pas la structure global du code qui me parait bizarre.
                • Partager sur Facebook
                • Partager sur Twitter
                  4 octobre 2010 à 7:40:08

                  Citation : MrKooky

                  @leo48: Débuggage.
                  Je pense que ses variables qu'il récupère de MySQL sont vides.
                  Mais bon, il s'est inscrit hier, il faut qu'il apprenne à pratiquer :p
                  En tous cas, tu t'y prends bien, drouchek, tu es un des premiers nouveaux que je vois qui donnent tout le code, des screens et tout ... :)


                  Les variables de Mysql ne sont pas vides. Par ce que le code marchait quand il n'y avait pas le password.

                  @leo48 Pourtant les requetes SQL sont justes. J'ai vérifié en changeant et la même erreur.


                  Citation : leo48

                  Tu veux faire quoi? Une vérification de mot de passe?
                  L'utilisateur rentre un login et un mot de passe?
                  Est ce que le mot de passe est différent pour chaque utilisateur?

                  Désolé de toutes ces questions mais c'est pour mieux cerner ton problèmes et pouvoir t'aider. ;)



                  Oui! En fait, je regarde si le mot de passe du membre inscrit est le même que celui du formulaire et je compare.Oui, un login ET un mot de passe. Et oui, il est differant pour tous les users.
                  Pour le isset, je test a midi.
                  Merci MrKooky et leo48 !!!
                  C'est vraiment sympa!
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 octobre 2010 à 9:20:12

                    Citation : leo48


                    Après relecture du code les requêtes sont :

                    SELECT login FROM login
                    SELECT password FROM login
                    



                    Et non :

                    SELECT login FROM login
                    SELECT login FROM password
                    



                    A mon avis c'est la seule erreur, la table "password" n'existant pas, il n'y a aucune chance que la requête puisse marcher
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 octobre 2010 à 9:42:17

                      Effectivement, c'est l'erreur majeure ^^
                      Aussi, je pense que la logique de vérification devrait s'articuler en ne sélectionnant que la ligne correspondant au login saisi, en ayant vérifié au préalable que le login existe dans la bdd par un COUNT() qui est très rapide.
                      Enfin, pense à sécuriser les données $_POST avant de les utiliser dans une requête.

                      Essaie par toi même, c'est plus gratifiant que de regarder ma proposition de correction. :-°


                      <?php
                      // Je me connecte à la base de données
                      try
                      {
                          $bdd = new PDO('mysql:host=localhost;dbname=log', 'root', '');
                      }
                      catch (Exception $e) // Si erreur
                      {
                              die('Erreur : ' . $e->getMessage());
                      }
                      
                      
                      //Sécurisation des données saisies
                      $login = htmlspecialchars($_POST['login']);
                      $password = htmlspecialchars($_POST['password']);
                      
                      //On vérifie que le login existe dans la table
                      $verif_login = $bdd->query('SELECT COUNT(*) FROM login WHERE login = '.$login.' ');
                      if($verif_login->fetchColumn() == 0)
                      { //Login inexistant
                          //Exception, erreur ou ce que tu désires
                      }
                      else { //Login existant
                      
                          //Séléction du password pour le login saisi
                          $reponse_login = $bdd->query('SELECT password FROM login WHERE login = '.$login.' LIMIT 1');
                          $donnees = $reponse_login->fetch();
                      
                          //Je vérifie que le mot de passe correspond
                          //Si le mot de passe est hashé dans la bdd, il faut appliquer ce hashage à $password dans la vérification ci-dessous
                          if ($password == $donnees['password'])
                          {
                              // La suite de mon code qui y sera après que je n'ai plus d'erreur et pour l'instant c'est :
                              echo "Ouais!!!!!! J'ai plus d'érreur!!!! ( C'EST BEAU LES REVES !)" ;
                          }
                          $reponse_login->closeCursor(); // Termine le traitement de la requête
                      }
                      
                      ?>
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 octobre 2010 à 12:35:19

                        @MoMoHelper

                        Citation : MomoHelper

                        Citation : leo48

                        Après relecture du code les requêtes sont :
                        Code : SQL - Sélectionner

                        1
                        2



                        SELECT login FROM login
                        SELECT password FROM login



                        Et non :
                        Code : SQL - Sélectionner

                        1
                        2



                        SELECT login FROM login
                        SELECT login FROM password



                        A mon avis c'est la seule erreur, la table "password" n'existant pas, il n'y a aucune chance que la requête puisse marcher



                        A, merci! Je n'ai plus CET l'erreur.
                        1...2...3...4min.
                        Ah!!!! Je me suis réjouie trop tôt ! ^^
                        J'ai une autre erreur!
                        Mon code :
                        <?php
                        // Je me connecte à la base de données
                        try
                        {
                            $bdd = new PDO('mysql:host=localhost;dbname=log', 'root', '');
                        }
                        catch (Exception $e) // Si erreur
                        {
                                die('Erreur : ' . $e->getMessage());
                        }
                        
                        
                        //Je choisis le champ login
                        $reponse_login = $bdd->query('SELECT login FROM login'); // Je choisis de la base de donné login le champ login
                        $reponse_password = $bdd->query('SELECT password FROM login    '); // Je choisis de la base de donné login le champ password
                        
                        //Je vérifie tout mes champs logins
                        while ($donnees = $reponse_login->fetch() AND $donees2 = $reponse_password->fetch()) // EDIT : Il n'y a plus d'erreur mais c'est à la ligne 20 maintenant
                        {
                            if ($_POST['login'] == $donnees['login'] AND $_POST['password'] == $donnees['password']) // ERREUR ICI
                            {
                                // La suite de mon code qui y sera après que je n'ai plus d'erreur et pour l'instant c'est :
                                echo "Ouais!!!!!! J'ai plus d'érreur!!!! ( C'EST BEAU LES REVES !)" ;
                            }
                        }
                        $reponse_login->closeCursor(); // Termine le traitement de la requête
                        $reponse_password->closeCursor(); // Termine le traitement de la requête
                        
                        
                        ?>
                        


                        Mon erreur affiché :
                        Notice: Undefined index: password in C:\wamp\www\seconnecter\testlog.php on line 20
                        

                        Dommage !

                        @jamesdu67
                        Avec ton code j'ai cer erreur :
                        Fatal error: Call to a member function fetchColumn() on a non-object in C:\wamp\www\seconnecter\testlog.php on line 19
                        

                        Et puis je ne comprend pas la ligne :
                        14 et 15 ou tu met htmlspecialchars.
                        18 ou il y a un count + limit 1 machin chose.
                        Et sa :
                        //Séléction du password pour le login saisi
                            $reponse_login = $bdd->query('SELECT password FROM login WHERE login = '.$login.' LIMIT 1');
                            $donnees = $reponse_login->fetch();
                        
                            //Je vérifie que le mot de passe correspond
                            //Si le mot de passe est hashé dans la bdd, il faut appliquer ce hashage à $password dans la vérification ci-dessous
                            if ($password == $donnees['password'])
                            {
                                // La suite de mon code qui y sera après que je n'ai plus d'erreur et pour l'instant c'est :
                                echo "Ouais!!!!!! J'ai plus d'érreur!!!! ( C'EST BEAU LES REVES !)" ;
                            }
                        

                        Excusez moi pour ces questions qui peuvent vous paraître idiotes, je ne suis que débutant en PHP.
                        MERCI !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 octobre 2010 à 14:33:00

                          ligne 20, $donnees2 au lieu de $donnees
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 octobre 2010 à 17:18:44

                            Bon une requête qui marche très bien pour vérifier un mot de passe et un login :
                            <?php
                            // Je me connecte à la base de données
                            try
                            {
                                $bdd = new PDO('mysql:host=localhost;dbname=log', 'root', '');
                            }
                            catch (Exception $e) // Si erreur
                            {
                                    die('Erreur : ' . $e->getMessage());
                            }
                            
                            
                            //Je vérifie le pseudo et e mot de passe
                            $req = $bdd->prepare('SELECT COUNT(*) AS membre_valide FROM login WHERE password = :password AND login = :login'); // Je compte le nombre d'entrée ayant pour mot de passe et login ceux rentrés
                            $req->bindValue(':password', $_POST['password'], PDO::PARAM_STR);
                            $req->bindValue(':login', $_POST['login'], PDO::PARAM_STR);
                            $data = $req->execute();
                            $req->closeCursor(); // Termine le traitement de la requête
                            
                            // Je teste la valeur de $data['membre_valide']
                            
                            if($data['membre_valide'] != 0) { // On as trouvé un membre avec ce couple mdp, login
                            
                                 echo 'Vous êtes connecté';
                            }
                            else { // Personne n'existe dans la table avec ce couple mdp, login
                            
                                 echo 'le login et le mot de passe rentrés sont invalides';
                            }
                            
                            
                            ?>
                            


                            Normalement ça marche sans problème (à part erreur de frappe :-° )

                            Ce code là est plus approprié que le tiens car il évite de placé tout le code de ta page dans une boucle.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 octobre 2010 à 17:21:40

                              MERCI !!!!!!!
                              Tout marche!!!
                              En éfait, c'était $donees2 et non $donnees
                              je vous upload le code :
                              <?php
                              // Je me connecte à la base de données
                              try
                              {
                                  $bdd = new PDO('mysql:host=localhost;dbname=log', 'root', '');
                              }
                              catch (Exception $e) // Si erreur
                              {
                                      die('Erreur : ' . $e->getMessage());
                              }
                              
                              
                              //Je choisis le champ login
                              $reponse_login = $bdd->query('SELECT login FROM login'); // Je choisis de la base de donné login le champ login
                              $reponse_password = $bdd->query('SELECT password FROM login    '); // Je choisis de la base de donné login le champ password
                              
                              //Je vérifie tout mes champs logins
                              while ($donnees = $reponse_login->fetch() AND $donees2 = $reponse_password->fetch()) // EDIT : Il n'y a plus d'erreur mais c'est à la ligne 20 maintenant
                              {
                                  if ($_POST['login'] == $donnees['login'] AND $_POST['password'] == $donees2['password']) // ERREUR ICI
                                  {
                                      // La suite de mon code qui y sera après que je n'ai plus d'erreur et pour l'instant c'est :
                                      echo "Ouais!!!!!! J'ai plus d'érreur!!!! ( C'EST BEAU LES REVES !)" ;
                                  }
                              }
                              $reponse_login->closeCursor(); // Termine le traitement de la requête
                              $reponse_password->closeCursor(); // Termine le traitement de la requête
                              
                              
                              ?>
                              

                              MERCI!
                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 octobre 2010 à 17:32:02

                                Ton code est correct mais ce n'est pas la meilleur façon de faire. Un boucle prend beaucoup plus de temps au niveau exécution si tu as 10 000 membres qu'une simple requête comme je t'ai montré.

                                Après c'est toi qui voit mais ça peut être rapidement lourd.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  6 octobre 2010 à 11:27:59

                                  Citation : leo48

                                  Ton code est correct mais ce n'est pas la meilleur façon de faire. Un boucle prend beaucoup plus de temps au niveau exécution si tu as 10 000 membres qu'une simple requête comme je t'ai montré.
                                  Après c'est toi qui voit mais ça peut être rapidement lourd.


                                  Oh OUI ++ avec toi ! franchement quand je vois un WHILE avec un IF dedans tout ça pour UNE seule solution :o

                                  Ton WHERE password = :password AND login = :login'
                                  c'est la classe :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    11 janvier 2011 à 19:18:17

                                    Bonsoir à tous,
                                    Je me permet de up ce sujet, car j'ai un petit soucis avec le code donné plus haut. ;)
                                    J'ai suivit les divers tuto du site et je me suis lancé dans la création du minichat. Jusque à présent ça se passe bien. :)
                                    Mais je voulais y lier des logins. :p

                                    J'ai donc créé une nouvelle table "users" avec "ID", "login", "password" et "access". ;)

                                    Et voici le script de connexion entré :

                                    <?php
                                    // Connexion à la BD
                                    try
                                    {
                                    $bdd = new PDO('mysql:host=localhost;dbname=minichat', 'root', '');
                                    }
                                    catch (Exception $e) // Si erreur
                                    {
                                    die('Erreur : ' . $e->getMessage());
                                    }

                                    // Contrôle du login et password
                                    $req = $bdd->prepare('SELECT COUNT(*) AS users FROM login WHERE password = :password AND login = :login'); // Calcul du nombre de compte
                                    $req->bindValue(':password', $_POST['password'], PDO::PARAM_STR);
                                    $req->bindValue(':login', $_POST['login'], PDO::PARAM_STR);
                                    $data = $req->execute();
                                    $req->closeCursor(); // Fin de la requête

                                    // Je teste la valeur de $data['membre_valide']

                                    if($data['users'] != 0) //Si résultat positif
                                    {

                                    echo 'Vous êtes connecté';
                                    } //if
                                    else // Si aucun résultat
                                    {

                                    echo 'le login et le mot de passe rentrés sont invalides';
                                    } //else
                                    ?>


                                    Malheureusement à chaque tentative, le message "le login et le mot de passe rentrés sont invalides" s'affiche.... :(

                                    Quelqu'un pourrait me donner un coup de main ? :)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      28 janvier 2011 à 22:17:00

                                      Je te conseille de recréer un sujet tout frais t'aura plus de réponses !!! :)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        30 avril 2016 à 14:29:50

                                        Bonjour

                                        Je pense que sa preacupation est sérieuse car en essayant d'adapter le code à mes pages, le message de la non validité des login et mot de passe persiste

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Login et mot de passe PHP Mysql

                                        × 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