Bonjour,
Je tombe sur ce problème depuis et je vous demande votre aide. J'aimerais vérifier que l'username existe dans ma bdd mais ça ne marche pas, meme avec des noms d'utilisateurs qui sont déja enrégistré ma bdd. Voici l'erreur que ça m'affiche : Username/Password do not match.**
Voici mon code :

if(isset($_POST['valider'])){
    $username = htmlentities($_POST['username']);
    $password = password_hash($_POST['password'],PASSWORD_DEFAULT);
    $password2 = password_hash($_POST['password2'],PASSWORD_DEFAULT);

    if (empty($_POST['username'])) {
        $error = true;
        $usernameError = "Please enter your username .";
    } else {
        if (empty($_POST['password'])) {
            $error = true;
            $passwordError = "Please enter your password .";
        } else {
            if (empty($_POST['password2'])) {
                $error = true;
                $password2Error = "Please confirm the password .";
            } else {
                if ($_POST['password'] != $_POST['password2']) {
                    $error = true;
                    $passworddifferentError = "Passwords are not the same .";
                } else {
                    $pdo = new PDO('mysql:host=localhost;dbname=projet;charset=UTF8', 'root',  '');
                    if (!$pdo) {
                        echo "Please check your information and try again";
                    } else {
                        $query = $pdo->prepare('SELECT * FROM `client6` WHERE username = :username AND password = :password');
                        $query->execute(array('username' => $username, 
                        'password' => $password));
                        if ($reponse = ($query)) {
                            if ($reponse->fetchColumn() == 1) {
                                $_SESSION['username'] = $username;
                                header("location: accueil.php");
                            } else {
                                $error = true;
                                $noncorrespondError = "Username/Password do not match .";
                            }
                        }
                    }
                }
            }
        }
    }
}

23 réponses


Pierrot01
Réponse acceptée

Salut,

        $username  = htmlentities($_POST['username']);
        $password   = $_POST['password'];
        $password2  = $_POST['password2'];
        $champsremplis  = !empty($username) && !empty($password) && !empty($password2);
        if(!$champremplis){$msgerr[] = "tous les champs sont obligatoires";}
        $correspondancepasswords = ($password == $password) ;
        if(!$correspondancepasswords){$msgerr[] = "Les mots de passes ne corespondent pas";}
        if(empty($msgerr){
            // ici, tout est OK
            // je peux rechercher dans la base de données
            $password = password_hash($password,PASSWORD_DEFAULT);
            $query = $pdo->prepare('SELECT * FROM client WHERE username = :username' and  password=:password");
            $result = $query->execute(array('username' => $username,'password=>$password));
            if($result->rowCount()>0){
                $user = $result->fetch(PDO::FETCH_ASSOC);
                $_SESSION['username'] =$user['username'];
                header("location: accueil.php");
            }else{
               $msg[] = "Utilisateur/Mot de passe inexistant";
            }
        }else{
            // traitement des erreurs
            foreach ($msgerr as $value){
                     echo $value."</br>";
            }
        }

        // retraitement des erreurs

@plus

Pierre

Bonsoir.
Tu ne cryptes pas les mots de passe en base de données ?
Si tu les cryptes, c'est normal que tu ne trouves aucun enregistrement en base de données correspondant au username et au password étant donné que tu envois le mot de passe non crypté en base de données pour ta requête.

Je ne te vois à aucun moment crypter le mot de passe avant de faire ta requête SQL.

iamlouky
Auteur

Voila

<?php
/*
Page: login.php
*/
 // à mettre tout en haut du fichier .php, cette fonction propre à PHP servira à maintenir la $_SESSION
session_start();
include("config.php");

try
{
// On se connecte à MySQL
  $pdo = new PDO('mysql:host=localhost;dbname=projet;charset=UTF8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
  die('Erreur : '.$e->getMessage());
}

$AfficherFormulaire=1;
$usernameError = "";
$passwordError ="";
$password2Error ="";
$passworddifferentError ="";
$noncorrespondError = "";
$adminpageError="";

if (isset($_SESSION['admin']) && $_SESSION['admin']=$username) {

    $adminpageError = "<p><a href='logout.php'>Log Out </a></p>";
}

if(isset($_POST['valider'])) {
    $username = htmlentities($_POST['username']);
    $password = password_hash($_POST['password'],PASSWORD_DEFAULT);
    $password2 = password_hash($_POST['password2'],PASSWORD_DEFAULT);
    if (empty($_POST['username'])) {
        $error = true;
        $usernameError = "Please enter your username .";
    } elseif (empty($_POST['password'])) {
        $error = true;
        $passwordError = "Please enter your password .";
    } elseif (empty($_POST['password2'])) {
        $error = true;
        $password2Error = "Please confirm the password .";
    } elseif ($_POST['password'] != $_POST['password2']) {
        $error = true;
        $passworddifferentError = "Passwords are not the same .";
    } else {
        $query = $pdo->prepare('SELECT * FROM `client` WHERE username = :username');
        $query->execute(array(
            'username' => $username
        ));
        $reponse = ($query);
        if ($reponse->fetchColumn() == 1) {
            $_SESSION['username'] = $username;
            header("location: accueil.php");
        } else {
            $error = true;
            $noncorrespondError = "Username/Password do not match .";
        }
    }
}

Bonsoir,
Il serait peut-être bien de comprendre ce que vous faites et d'arrêter de faire du copier-coller.

if ($reponse = ($query)) {

A quoi correspond cette ligne et quelle est son role ?

Lartak vous demande pourquoi vous ne crypter pas les mdp et vous, vous contenter seulement de "crypter" le mot de pase reçu mais est-ce qu'il a été fait lors de l'insertion ?

De plus

$password = htmlentities($_POST['password']);
    $password2 = htmlentities($_POST['password2']);
    $password = password_hash($_POST['password'],PASSWORD_DEFAULT);
    $password2 = password_hash($_POST['password2'],PASSWORD_DEFAULT);

A quoi servent les deux premières ligne ?

iamlouky
Auteur

D'abord, merci pour votre réponse.
les 2 lignes été corrigées

$username = htmlentities($_POST['username']);
$password = password_hash($_POST['password'],PASSWORD_DEFAULT);
$password2 = password_hash($_POST['password2'],PASSWORD_DEFAULT);

D'abord j'ai fait une requete préparée pour vérifier si les variables username et mot de passe existent dans la base de donnée

$query = $pdo->prepare('SELECT * FROM `client` WHERE username = :username AND password = password_hash(:password, PASSWORD_DEFAULT)');

A la suite $query = $pdo->execute() . J'ai utilisé ensuite

if ($reponse = ($query))

si $reponse = ($query) , faut voir si $reponse->fetchColumn() == 1, si ces 2 conditions sont exsistent alors j'aimerais que la page s'affiche :

$_SESSION['username'] = $username;
header("location: accueil.php");

Sauf qu'on ne fait pas de comparaison avec un seul = ....

iamlouky
Auteur

Comparaison sur quelle ligne?

if ($reponse = ($query))
iamlouky
Auteur

J'aimerais que juste que si username et mot de passe exsistent dans la base de donné, que la page s'affiche

$_SESSION['username'] = $username;
header("location: accueil.php");

sinon

$error = true;
$noncorrespondError = "Username/Password do not match .";

Avant de tester le mot de passe, vérifie déjà que l'utilisateur existe dans ta requête sql. Cela permettra de vérifier que cette dernière est correcte.

iamlouky
Auteur

vérifie que l'utilisateur existe dans ta requête sql comme ceci?

$query = $pdo->prepare('SELECT * FROM `client6` WHERE username = :username AND password = :password');

Sans le mot de passe pour le moment.

iamlouky
Auteur

Et ensuite je fais une requete pour vérifier si le mot de passe existe aussi ?

Non juste l'utilisateur, comme je l'ai dit, cela permettra de vérifier que la requête s'exécute bien

iamlouky
Auteur

Ca ne marche toujours pas, je me damande si les conditions sont bien faites?

Le mot "conditions" est faible :D
j'ai rarement un imbroglio de testssss aussi fournis :D :D

@pluche

Pierre

iamlouky
Auteur

Vous me suggérez quoi alors ?

Salut,
Du code lisible, ce serai bien :D
trop de if imbriqués, c'est illisible.
pourtant, le traitement est simple.
Les 3 champs doivent être remplis, et correspondance des passwords donc :

        $username  = htmlentities($_POST['username']);
        $password   = $_POST['password'];
        $password2  = $_POST['password2'];
        $champsremplis  = !empty($username) && !empty($password) && !empty($password2);
        if(!$champremplis){$msgerr[] = "tous les champs sont obligatoires";}
        $correspondancepasswords = ($password == $password) ;
        if(!$correspondancepasswords){$msgerr[] = "Les mots de passes ne corespondent pas";}
        if(empty($msgerr){
            // ici, tout est OK
            // je peux rechercher dans la base de données
        }else{
            // traitement des erreurs
            foreach ($msgerr as $value){
                     echo $value."</br>";
            }
        }

il faut simplifier le code !! :D

@pluche

Pierre

iamlouky
Auteur

J'avoue que votre code est très lisible mais là je n'arrive pas à rechercher les variables dans la base de donnée . Cela m'affiche Les mots de passes ne corespondent pas

if(isset($_POST['valider'])) {
    $username = htmlentities($_POST['username']);
    $password = password_hash($_POST['password'],PASSWORD_DEFAULT);
    $password2 = password_hash($_POST['password2'],PASSWORD_DEFAULT);
    $champsrempli = !empty($username) && !empty($password) && !empty($password2);
    if(!$champsrempli){$msgerr[] = "tous les champs sont obligatoires";}
        $correspondancepasswords = $password == $password2 ;
        if(!$correspondancepasswords){$msgerr[] = "Les mots de passes ne corespondent pas";}
        if(empty($msgerr)){
            $query = $pdo->prepare('SELECT * FROM client WHERE username = :username');
            $query->execute(array('username' => $username));
             $query == 1;
             $_SESSION['username'] = $username;
            header("location: accueil.php");
        } else {
            foreach ($msgerr as $value){
                echo $value."</br>";
            }
        }
    }
iamlouky
Auteur

Fatal error: Call to a member function rowCount() on a non-object in C:\wamp\www\On line\agency\authentification\login.php on line 16

if(isset($_POST['valider'])) {
    $username = htmlentities($_POST['username']);
    $password = $_POST['password'];
    $password2 = $_POST['password2'];
    $champsremplis  = !empty($username) && !empty($password) && !empty($password2);
    if(!$champsremplis){$msgerr[] = "Tous les champs sont obligatoires";}
    $correspondancepasswords = ($password == $password2) ;
    if(!$correspondancepasswords){$msgerr[] = "Les mots de passes ne corespondent pas";}
    if(empty($msgerr)){
    // ici, tout est OK
            // je peux rechercher dans la base de données
        $password = password_hash($password,PASSWORD_DEFAULT);
        $query = $pdo->prepare('SELECT * FROM client WHERE username = :username and  password = :password');
        $result = $query->execute(array('username' => $username, 'password' => $password));
        if($result->rowCount()>0){
            $user = $result->fetch(PDO::FETCH_ASSOC);
            $_SESSION['username'] =$user['username'];
            header("location: accueil.php");
        } else {
            $msg[] = "Utilisateur/Mot de passe inexistant";
        }
    } else {
     // traitement des erreurs
        foreach ($msgerr as $value){
            echo $value."</br>";
        }
    }
// retraitement des erreurs

if($query->rowCount()>0){
@plus

Pierre

iamlouky
Auteur

D'abord merci Pierrot01 pour ce grand aide. la page ne retourne rien, ça reviens sur la meme page.