[PHP/SQL/PDO] Problèmes de requête

Par Jaina jaina, il y a 10 ans


Bonjour,
Salut à tous !
je suis entrain de faire un site commercial pour mon projet de fin d'étude , et j'ai "presque" terminé
sauf que j'ai rencontré un petit problème au niveau de la réinitialisation du mot de passe oublié..
Pour ce faire, j'ai suivi le tuto de Grafikart pour l'espace membre , et qui a créé deux pages, forget.php et reset.php
la première pour faire entrer l'email du client et vérifier si il existe vraiment , si oui, un email de récuperation de mot de passe lui sera envoyé, en cliquant sur le lien il sera redirigé vers reset.php pour creer un nouveau mot de passe.
le problème se situe au niveau de la premiere étape, c'est que même si le client existe dans ma base de données , ça m'afficher "ce client n'existe pas" , c'est le msg d'erreur que j'ai créé, et j'ignore vraiment la cause Confus ... donc voila pourquoi je suis venue vers vous pour m'aider à percer ce petit mystère -.-
je vais vous montrer maintenant tout le code de cette partie.

forget.php

<?php ini_set('display_errors','on'); require 'inc/bootstrap.php'; if(!empty($_POST) && !empty($_POST['email'])){ $db = App::getDatabase(); $auth = App::getAuth(); $session = Session::getInstance(); if($auth->resetPassword($db, $_POST['email'])){ $session->setFlash('success', 'Les instructions du rappel de mot de passe vous ont &eacute;t&eacute; envoy&eacute;es par email'); App::redirect('login.php'); }else{ $session->setFlash('danger', 'Aucun compte ne correspond a cette adresse'); } } ?> <?php require 'inc/header2.php'; ?> <h2 align="center"> R&eacute;cup&eacute;ratuon de mot de passe ? </h2> <div align="center"> <p align="center">Indiquez votre email ci-dessous puis validez. Vous recevrez dans quelques instants, par email, un lien vous permettant de r&eacute;initialiser facilement votre mot de passe.</p> <form class="form-inline" method="POST" action=""> <div class="form-group" > <label for="email" class="label-left">Votre adresse email</label> <input id="email" class="form-control" name="email" type="email"/> <button type="submit" class="btn btn-primary">Valider</button> </div> <?php require 'inc/footer.php'; ?>

reset.php

<?php require 'inc/bootstrap.php'; if(isset($_GET['id_customer']) && isset($_GET['token'])){ $auth = App::getAuth(); $db = App::getDatabase(); $user = $auth->checkResetToken($db, $_GET['id_customer'], $_GET['token']); if($user){ if(!empty($_POST)){ $validator = new Validator($_POST); $validator->isConfirmed('passwd'); if($validator->isValid()){ $passwd = $auth->hashPassword($_POST['passwd']); $db->query('UPDATE customer SET passwd = ?, reset_at = NULL, reset_token = NULL WHERE id_customer = ?', [$passwd , $_GET['id_customer']]); $session->setFlash('success', 'Votre mot de passe a bien été changé'); $auth->connect($user); App::redirect('index.php'); } } }else{ Session::getInstance()->setFlash('danger', "Ce token n'est plus valide"); App::redirect('login.php'); } }else{ App::redirect('login.php'); } ?> <?php require 'inc/header2.php'; ?> <h1>Réinitialiser mon mot de passe</h1> <form method="POST" action="" autocomplete="on"> <div class="form-group"> <label for="passwd" >Mot de passe</label> <input id="passwd" name="passwd" type="password" class="form-control"/> </div> <div class="form-group"> <label for="passwd" >Confirmation du mot de passe</label> <input id="passwd" name="mdp_confirm" type="password" class="form-control"/> </div> <button type="submit" name="" class="btn btn-primary">Changer mon mot de passe</button> <?php require 'inc/footer.php'; ?>

et les deux functions de resetPassword et CheckResetToken

public function resetPassword($db, $email){ $user = $db->query('SELECT * FROM customer WHERE (email = :email) AND confirmed_at IS NOT NULL ', ['email' => $email])->fetch(PDO::FETCH_OBJ); if($user){ $reset_token = Str::random(60); $db->query('UPDATE customer SET reset_token = ?, reset_at = NOW() WHERE id_customer = ?', [$reset_token, $user->id_customer]); //pas besoin de faire un fetch c un update mail($_POST['email'], 'Réinitialiser votre mot de passe', "Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://localhost/TOUPACKGROUP/reset.php?id_customer={$user->id_customer}&token=$reset_token"); return $user; } return false; } public function checkResetToken($db, $user_id, $token){ return $db->query('SELECT * FROM customer WHERE id_customer = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)', [$user_id, $token])->fetch(PDO::FETCH_OBJ); }

Je serai vraiment très reconnaissante pour votre aide >< ! Le jour J approche et je commence vraiment à stresser :'s

18 réponses

Carouge10, il y a 10 ans

Bonjour,
Je ne vois pas le "ce client n'existe pas" dans vos fonctions.
D'après vos dire c'est la fonction "resetpassword" renvoie false ?

Jaina jaina, il y a 10 ans

@Courgue
la voila =

sinon , mon sujet n'est pas résulu j'ai cliqué par errur sur "il a répondu a ma question" ><
et oui c'est la fonction resetPassword qui renoie false

Carouge10, il y a 10 ans

Si vous supprimez la 2ème partie du WHERE dans la requète de la fonction "resetPassword" que vaut $user ?

Jaina jaina, il y a 10 ans

boolean false

Carouge10, il y a 10 ans

Puis-je avoir le code de la fonction query ?
Vous avez accès à PhpMyAdmin ?

Jaina jaina, il y a 10 ans

le voila , mais elle marche parfaitement avec les autres méthodes

public function query($query, $params = false){ try { if($params){ $req = $this->bdd->prepare($query); $req->execute($params); }else{ $req = $this->bdd->query($query); } return $req;} catch(Exception $e) { echo 'Exception -> '; var_dump($e->getMessage()); }
Carouge10, il y a 10 ans

En essayant la requête dans phpmyadmin ou votre console, est-ce qu'elle fonctionne ?

Jaina jaina, il y a 10 ans

oui elle fonctionne :/

Carouge10, il y a 10 ans

Vous affichez les erreurs mysql ?

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Jaina jaina, il y a 10 ans

yep , c'est fais dés le début

Carouge10, il y a 10 ans

là je sèche

Jaina jaina, il y a 10 ans

ahahaha pareil que toi xD

Huggy, il y a 10 ans

Tu utilises pdo::query en passant des paramètres ????
tu mélanges pdo::query et pdo::prepare

Jaina jaina, il y a 10 ans

mais si j enleve les paramètres ca fonctioenne toujours ? :x

Huggy, il y a 10 ans

Essaye ceci

public function resetPassword($db, $email){ $stmt = $db->prepare('SELECT * FROM customer WHERE (email = :email) AND confirmed_at IS NOT NULL'); if ($stmt->execute(['email' => $email])) { if($user = $stmt->fetch(PDO::FETCH_OBJ)){ $reset_token = Str::random(60); $stmt2 = $db->prepare("UPDATE customer SET reset_token = :token, reset_at = NOW() WHERE id_customer = :id_cust"); if ($stmt2->execute(['token' => $reset_token, 'id_cust' => $user->id_customer])) { mail($_POST['email'], 'Réinitialiser votre mot de passe', "Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://localhost/TOUPACKGROUP/reset.php?id_customer={$user->id_customer}&token=$reset_token"); return $user; } } } return false; }
Jaina jaina, il y a 10 ans

mais bizarre, c'est pareil omg ><

Huggy, il y a 10 ans

Dans ce cas rajoute des else à chaque if et affiche des traces
Tu verras où ça coince

Jaina jaina, il y a 10 ans

ok je vais voir ce que ça va donner et je revien vers vous