problème de récupération de mot de passe

Suivre ce topic
Ce topic est suivi par : Personne...
JxSDev

JxSDev Le 26 avril 2016 à 12:06 (Édité le 25 janvier 2019 à 17:50)

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 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 😕 ... 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
   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 été envoyé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écupé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é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 mes 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 
Aendawan

Aendawan Le 26 avril 2016 à 17:30

tes données de ta query j'y aurais mi un fetch_array(), et ensuite dans le if j'aurai fait count($user) == 1 pour vérifier qu'il existe car le soucis viens du fais que resetPassword($db, $email) retourne tout le temps false donc $user == false.
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte