Vérification dans base de donnée

Par iamlouky, il y a 8 ans


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

Carouge10, il y a 8 ans

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

iamlouky, il y a 8 ans

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

Pierrot01, il y a 8 ans

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

@pluche

Pierre

Lartak, il y a 8 ans

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.

Lartak, il y a 8 ans

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

iamlouky, il y a 8 ans

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 ."; } } }
Carouge10, il y a 8 ans

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, il y a 8 ans

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");
Carouge10, il y a 8 ans

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

iamlouky, il y a 8 ans

Comparaison sur quelle ligne?

Carouge10, il y a 8 ans
if ($reponse = ($query))
iamlouky, il y a 8 ans

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 .";
Carouge10, il y a 8 ans

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, il y a 8 ans

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');
Carouge10, il y a 8 ans

Sans le mot de passe pour le moment.

iamlouky, il y a 8 ans

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

iamlouky, il y a 8 ans

Vous me suggérez quoi alors ?

Pierrot01, il y a 8 ans

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, il y a 8 ans

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>"; } } }
Pierrot01, il y a 8 ans

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

iamlouky, il y a 8 ans

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
Pierrot01, il y a 8 ans

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

Pierre

iamlouky, il y a 8 ans

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