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
Réponse acceptée

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 ?

@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

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

boolean false

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

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());
        }

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

oui elle fonctionne :/

Vous affichez les erreurs mysql ?

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

là je sèche

ahahaha pareil que toi xD

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

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

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;
}

mais bizarre, c'est pareil omg ><

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

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