Bonjour,

Je rencontre un petit problème avec mon code. J'ai mis en place un système d'authentification avec un formulaire et une fonction. Lorsque je hash mon POST j'ai la bonne chaîne de caractère qui est envoyé dans la fonction, mais la fonction me retourne un false lorsqu'elle interroge la BDD.

Ce que je fais

Le formulaire

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Créer un utilisateur</title>
    <link rel="stylesheet" href="/css/form.css">
</head>
<body>
    <?php require 'header.php' ?>
    <div class="container">
        <?php if(isset($_POST['password'])): ?>
            <div class="alert">
                <span class="closebtn" onclick="this.parentElement.style.display='none';">&times;</span> 
                Identifiant ou mot de passe incorrect.
            </div>
        <?php
        endif;
        ?>
        <div class="form-group">
            <h1>Se connecter:</h1>
            <form action="" method='POST'>
                <div class="required">
                    <label for="log_in">Identifiant</label>
                    <input type="text" name="log_in" placeholder="Votre identifiant" required/>
                </div>
                <div class="required">
                    <label for="password">Mot de passe</label>
                    <input type="password" name="password" placeholder="Votre mot de passe" required/>
                </div>
                <div class="form-submit">
                    <button class="btn-submit click-animation" type="submit" value="S'inscrire" >S'inscrire</button>
                </div>
            </form>
        </div>
    </div>
</body>
</html>

La logique de requête

<?php

    if(!isset ($_POST['log_in']) && !isset ($_POST['password'])){
        require_once 'userConnectionForm.php';        
    }else{
        require_once 'userFunctions.php';

        $user_log = $_POST['log_in'];
        $user_pass = hash('sha256', $_POST['password']);

        $user= [$user_log, $user_pass];
        $user_login= logmein($user);

        if(in_array(true, $user_login)){
            echo "Vous êtes bien connecté!";
        }else{
            require_once 'userConnectionForm.php';
            var_dump($user);
            var_dump($user_login);
            echo $user_pass;
        };
    };

La fonction

function logmein(array $user): array{
    require 'pdo.php';
    $u_log = $user[0];
    $u_pass = $user[1];

    $req = $bdd->prepare('SELECT (log_in, u_password) WHERE log_in = :log_in AND u_password = :u_pass');
    $req->execute(array(
        'log_in' => $user[0],
        'u_pass' => $user[1]
    ));
    $finduser= $req->fetch();

    if(!empty ($finduser)){
        return [true, $finduser['u_pass']];
    }else{
        return [false, $finduser['u_pass']];
    };
    $finduser->closeCursor();
};

Ce que j'obtiens

J'ai un retour différent de l'envoie. Je n'arrive pas à comprendre pourquoi ma fonction ne prend pas en compte le POST hashé d'autant plus que la chaîne de caractère est bien celle enregistré dans la BDD

E:\wamp64\www\userConnection.php:18:
array (size=2)
  0 => string 'thumelhans' (length=10)
  1 => string 'ff7e3fed986d813c1734c3e3b0d73af7cbdfd1496c62ed1b9080070d0ac0d254' (length=64)
E:\wamp64\www\userConnection.php:19:
array (size=2)
  0 => boolean false
  1 => null
ff7e3fed986d813c1734c3e3b0d73af7cbdfd1496c62ed1b9080070d0ac0d254

6 réponses


bidule
Réponse acceptée

Hello ,

essai avec ça:

  function logmein(array $user): array{
      require 'pdo.php';
      $u_log = $user[0];
      $u_pass = $user[1];

      $req = $bdd->prepare('SELECT (log_in, u_password) WHERE log_in = :log_in AND u_password = :u_pass');
      $req->execute(array(
          'log_in' => $user[0],
          'u_pass' => $user[1]
      ));
      $finduser= $req->fetch();

      if(!empty ($finduser)){
          return [true, $finduser[1]];
      }else{
          return [false, $finduser[1]];
      };
      $finduser->closeCursor();
  };

Bonjour,

Qu'est ce que ça donne si tu fais un var_dump de "$req->fetch()" ?

Est-ce que tu a essayé de passer ta requête dans un éditeur SQL, comme celui de phpMyAdmin par exemple ?

Hello,

Déjà tu as une incohérence sur tes noms de champs.

Dans ta requête SQL :

where u_password

Dans ton return php

return [true, $finduser['u_pass']];

Comment se nomme ta colonne en base de données ? u_pass ou u_password ?

Comme l'a dit @Soundboy39, si tu lance la requête SQL hors PHP (dans phpMyAdmin par exemple), te ressort-il un résultat ? Es-tu sûr que tes données sont bonnes ? (hashage en sha256, username, nom de colonnes, etc).

Bon après vérification j'avais oublié le FROM users
Cependant le problème persiste. Ce qui est bizarre c'est que ce genre de requete je l'ai déjà faites avec la même syntaxe et j'avais eu aucun problème. Le fait d'avoir ajouter le hash semble faire dysfonctionner la requête.
Dans ma BDD j'ai bien la colonne en "u_password" mais il me semble que tout ce qui a après le = : est un alias pour la construction de l'array.
Et dans phpmyadmin j'ai cette erreur


SELECT * FROM users WHERE log_in = :log_in AND u_password = :u_password LIMIT 0, 25
MySQL a répondu : Documentation

#1064 - Erreur de syntaxe près de ':log_in AND u_password = :u_password LIMIT 0, 25' à la ligne 1

Merci Bidulen, mais ça ne marche pas. J'ai l'impression que la variable qui contient le hash du password est pas envoyé à la fonction ou que la fonction la consière comme 0 ou null alors que les var_dump me donne les bonnes infos.
Vraiment bizarre ce problème.

Alors il va falloir m'expliquer un truc que je pige pas. De ce que j'ai compris du dev, du code et du scripting quand on déclare une variable celle-ci vaut la même chose que ce qui a dedans. Alors pourquoi quand je remplace mon array dans l'execute ça marche. En gros quand je mets $user[0] et $user[1] ça ne marche pas et quand je mets les variables préalablement déclaré ça marche. Pourquoi alors que l'un vaut l'autre.

 require 'pdo.php';
    $u_log = $user[0];
    $u_pass = $user[1];

    $req = $bdd->prepare("SELECT (log_in, u_password) FROM users WHERE log_in = :log_in AND u_password = :u_password");
    $req->execute(array(
        'log_in' => $u_log,
        'u_password' => $u_pass
    ));
    $finduser= $req->fetch();

Enfin merci à vous je passe en résolu !