TUTO PHP - Mot de passe oublié ?


Je vous propose de voir comment créer un système de récupération de mot de passe en PHP ! Je sais, le tuto est assez long, mais le résultat est sympa (je trouve) 😛

Quelques liens utiles:
- Envoyer des mails en PHP
- Créer un espace membre en PHP #1

Code PHP du tuto:
<?php
session_start();

if(isset($_POST['recup_submit'],$_POST['recup_mail'])) {
   if(!empty($_POST['recup_mail'])) {
      $recup_mail = htmlspecialchars($_POST['recup_mail']);
      if(filter_var($recup_mail,FILTER_VALIDATE_EMAIL)) {
         $mailexist = $bdd->prepare('SELECT id,pseudo FROM membres WHERE mail = ?');
         $mailexist->execute(array($recup_mail));
         $mailexist_count = $mailexist->rowCount();
         if($mailexist_count == 1) {
            $pseudo = $mailexist->fetch();
            $pseudo = $pseudo['pseudo'];
            
            $_SESSION['recup_mail'] = $recup_mail;
            $recup_code = "";
            for($i=0; $i < 8; $i++) { 
               $recup_code .= mt_rand(0,9);
            }
            $mail_recup_exist = $bdd->prepare('SELECT id FROM recuperation WHERE mail = ?');
            $mail_recup_exist->execute(array($recup_mail));
            $mail_recup_exist = $mail_recup_exist->rowCount();
            if($mail_recup_exist == 1) {
               $recup_insert = $bdd->prepare('UPDATE recuperation SET code = ? WHERE mail = ?');
               $recup_insert->execute(array($recup_code,$recup_mail));
            } else {
               $recup_insert = $bdd->prepare('INSERT INTO recuperation(mail,code) VALUES (?, ?)');
               $recup_insert->execute(array($recup_mail,$recup_code));
            }
            $header="MIME-Version: 1.0\r\n";
         $header.='From:"PrimFX.com"<[email protected]>'."\n";
         $header.='Content-Type:text/html; charset="utf-8"'."\n";
         $header.='Content-Transfer-Encoding: 8bit';
         $message = '
         <html>
         <head>
           <title>Récupération de mot de passe - PrimFX.com</title>
           <meta charset="utf-8" />
         </head>
         <body>
           <font color="#303030";>
             <div align="center">
               <table width="600px">
                 <tr>
                   <td>
                     
                     <div align="center">Bonjour <b>'.$pseudo.'</b>,</div>
                     Voici votre code de récupération: <b>'.$recup_code.'</b>
                     A bientôt sur <a href="http://primfx.com/">PrimFX.com</a> !
                     
                   </td>
                 </tr>
                 <tr>
                   <td align="center">
                     <font size="2">
                       Ceci est un email automatique, merci de ne pas y répondre
                     </font>
                   </td>
                 </tr>
               </table>
             </div>
           </font>
         </body>
         </html>
         ';
         mail($recup_mail, "Récupération de mot de passe - PrimFX.com", $message, $header);
            header("Location:http://127.0.0.1/path/recuperation.php?section=code");
         } else {
            $error = "Cette adresse mail n'est pas enregistrée";
         }
      } else {
         $error = "Adresse mail invalide";
      }
   } else {
      $error = "Veuillez entrer votre adresse mail";
   }
}
if(isset($_POST['verif_submit'],$_POST['verif_code'])) {
   if(!empty($_POST['verif_code'])) {
      $verif_code = htmlspecialchars($_POST['verif_code']);
      $verif_req = $bdd->prepare('SELECT id FROM recuperation WHERE mail = ? AND code = ?');
      $verif_req->execute(array($_SESSION['recup_mail'],$verif_code));
      $verif_req = $verif_req->rowCount();
      if($verif_req == 1) {
         $up_req = $bdd->prepare('UPDATE recuperation SET confirme = 1 WHERE mail = ?');
         $up_req->execute(array($_SESSION['recup_mail']));
         header('Location:http://127.0.0.1/path/recuperation.php?section=changemdp');
      } else {
         $error = "Code invalide";
      }
   } else {
      $error = "Veuillez entrer votre code de confirmation";
   }
}
if(isset($_POST['change_submit'])) {
   if(isset($_POST['change_mdp'],$_POST['change_mdpc'])) {
      $verif_confirme = $bdd->prepare('SELECT confirme FROM recuperation WHERE mail = ?');
      $verif_confirme->execute(array($_SESSION['recup_mail']));
      $verif_confirme = $verif_confirme->fetch();
      $verif_confirme = $verif_confirme['confirme'];
      if($verif_confirme == 1) {
         $mdp = htmlspecialchars($_POST['change_mdp']);
         $mdpc = htmlspecialchars($_POST['change_mdpc']);
         if(!empty($mdp) AND !empty($mdpc)) {
            if($mdp == $mdpc) {
               $mdp = sha1($mdp);
               $ins_mdp = $bdd->prepare('UPDATE membres SET motdepasse = ? WHERE mail = ?');
               $ins_mdp->execute(array($mdp,$_SESSION['recup_mail']));
              $del_req = $bdd->prepare('DELETE FROM recuperation WHERE mail = ?');
              $del_req->execute(array($_SESSION['recup_mail']));
               header('Location:http://127.0.0.1/path/connexion/');
            } else {
               $error = "Vos mots de passes ne correspondent pas";
            }
         } else {
            $error = "Veuillez remplir tous les champs";
         }
      } else {
         $error = "Veuillez valider votre mail grâce au code de vérification qui vous a été envoyé par mail";
      }
   } else {
      $error = "Veuillez remplir tous les champs";
   }
}
?>


Code HTML:

<h4 class="title-element">Récupération de mot de passe</h4>
<?php if($section == 'code') { ?>
Un code de vérification vous a été envoyé par mail: <?= $_SESSION['recup_mail'] ?>
<br/>
<form method="post">
   <input type="text" placeholder="Code de vérification" name="verif_code"/><br/>
   <input type="submit" value="Valider" name="verif_submit"/>
</form>
<?php } elseif($section == "changemdp") { ?>
Nouveau mot de passe pour <?= $_SESSION['recup_mail'] ?>
<form method="post">
   <input type="password" placeholder="Nouveau mot de passe" name="change_mdp"/><br/>
   <input type="password" placeholder="Confirmation du mot de passe" name="change_mdpc"/><br/>
   <input type="submit" value="Valider" name="change_submit"/>
</form>
<?php } else { ?>
<form method="post">
   <input type="email" placeholder="Votre adresse mail" name="recup_mail"/><br/>
   <input type="submit" value="Valider" name="recup_submit"/>
</form>
<?php } ?>
<?php if(isset($error)) { echo '<span style="color:red">'.$error.'</span>'; } else { echo ""; } ?>


A propos de l'auteur

PrimFX
PrimFX

Salut tout le monde ! Je m'appelle Boris, j'ai 18 ans et je suis passionné d'informatique et de technologie. Je partage cette passion à travers mes vidéos que tu peux retrouver sur YouTube sous le nom de PrimFX ou bien sur ce site bien sûr (tutoriels de programmation (HTML, CSS, PHP), gameplays, vlogs high-tech...). @+

A voir aussi

32 Commentaires

POSTER UN COMMENTAIRE

Vous devez être connecté pour pouvoir poster un commentaire...

Pas encore de compte ? Créez-en un ici !



  • Photo de profil de TheFlameflo

    TheFlameflo

    29 November 2015 à 14:45

    J'aime bien !

    Je vais essayer de suivre le tuto, malgré qu'il soit assez long (mais vraiment utile ! 😉.

  • Photo de profil de PrimFX

    PrimFX | Membre Premium

    29 November 2015 à 15:13

    @TheFlameflo Ça marche, tu me diras si tout fonctionne bien ;-)

  • Photo de profil de onesyst

    onesyst

    29 November 2015 à 21:54

    Bravo PrimFX. malgres la longue durée du tuto, il est captivant et très bien expliqué.

  • Photo de profil de PrimFX

    PrimFX | Membre Premium

    30 November 2015 à 16:23

    @onesyst Merci !

  • Photo de profil de kebson95

    kebson95

    25 December 2015 à 20:58

    Fatal error: Cannot use object of type stdClass as array in C:\wamp\www...

    Salut Primfx...

    Voilà l'erreur que j'aperçois quand je teste...

    C'est au niveau de cette ligne $verif_confirme = $verif_confirme['confirme'];

    Merci d'avance

  • Photo de profil de tway243

    tway243

    05 January 2016 à 03:05

    excelent tuto @PrimFX, cependant j'ai un petit problème avec la $_SESSION['recup_mail'] de la ligne 3 du code html ca me marque " Undefined index:"

  • Photo de profil de MrDeym69

    MrDeym69

    17 January 2016 à 16:32

    a la ligne 127 on a pas definie la variable $section

  • Photo de profil de bigus

    bigus

    24 February 2016 à 23:01

    @tway243

    as-tu résolu ton problème, j'ai le même et je ne trouve pas la solution ? si oui, peux tu partager !!!

    merci

  • Photo de profil de bigus

    bigus

    25 February 2016 à 21:34

    Oups, j'ai trouvé...je n'avais pas activé MIME et SESSION sur apache !!

  • Photo de profil de Paolacci

    Paolacci

    05 April 2016 à 21:23

    Notice: Undefined index: recup_mail in

    J'arrive pas à résoudre cette erreur...

  • Photo de profil de Blast0Kd

    Blast0Kd

    17 April 2016 à 11:47

    @Paolacci essaye de publier ton site. En local, des erreur s'affiche alors qu'en ligne il n'y en à pas XD

  • Photo de profil de wil03

    wil03

    23 April 2016 à 20:29

    J'ai le même problème avec le Undefined index: recup_mail in et l'erreur serait à cette ligne $verif_confirme->execute(array($_SESSION['recup_mail']));

    C'est qu'il a perdu le fait qu'on soit en session?

  • Photo de profil de JxSDev

    JxSDev

    27 April 2016 à 12:29

    meme avec

    if(isset($_GET['section'])){

    $section = htmlspecialchars($_GET['section']);

    }

    la variable $section n'est toujours pas définies

    quelqu'un aurait une solution pour ça ??

  • Photo de profil de JxSDev

    JxSDev

    27 April 2016 à 13:19

    @kebson95

    j'ai eu la même erreur ^^ est tu arrivé à la débuguer ?

  • Photo de profil de Ryma

    Ryma

    07 June 2016 à 12:02

    salut svp j'ai un problème ici <?php if($section == 'code') { ?> et encore la <?php } elseif($section == "changemdp") { ?>

    quelqu’un pourrez m'aidez !!!

  • Photo de profil de Femball

    Femball

    08 June 2016 à 20:48

    Salut à tous.

    Pour l'erreur sur $section:

    Moi j'ai ajouté les lignes suivantes au début de mon fichier "recuperation.php" et ça fonctionne. Si ça peut aider



    if(isset($_GET['section'])) {

    $section = htmlspecialchars($_GET['section']);

    }



  • Photo de profil de Femball

    Femball

    09 June 2016 à 02:16

    Oups

    désolé c'est ceci que j'ai rajouté dans "recuperation.php" juste apres le

    session_start();

    [Ajout]

    if(isset($_GET['section'])) {

    $section = htmlspecialchars($_GET['section']);

    } else {

    $section = "";

    }

    Et là tout fonctionne.

    Bon courage !!

  • Photo de profil de jeanboudis

    jeanboudis

    03 November 2016 à 19:29

    Bonjour Boris, je suis jean kevin. J'ai bien suivi le tuto et cela fonctionne bien mais quand je renseigne l'adresse mail pour signifier que je veux reinitialiser mon mot de passe, après avoir cliqué sur le bouton valider, je ne reçois rien dans mon compte mail

  • Photo de profil de Zenteck

    Zenteck

    01 December 2016 à 22:20

    bonjours, j'ai une erreur au niveau de cette ligne

    ---------------------------------

    $mailexist = $bdd->prepare('SELECT id,pseudo FROM membres WHERE mail = ?');

    --------------------------------

    le navigateur me dit:

    Undefined variable: bdd in C:\wamp\www\recuperation.php on line 17



    help please !

  • Photo de profil de stoppreniumm

    stoppreniumm

    22 December 2016 à 20:38

    Bonjour,



    Problème sur le codage que je n'arrive pas a regler, quand je mes mon email je valide et sa me laisse sur la page ou je dois remettre l'email et valider l'email mes je recois le mail mes je reste sur la meme page.

    Peut tu m'aider ?

  • Photo de profil de stoppreniumm

    stoppreniumm

    22 December 2016 à 20:42

    @Zenteck Mes une connexion a ta base de donnée si sa deconne:



    <?php



    $bdd = new PDO("mysql:host=HOST;dbname=NAME DDB;charset=utf8", "NOM DDB", "MDP");



    ?>

  • Photo de profil de blabla95

    blabla95

    19 January 2017 à 20:57

    Bonsoir,

    SVP dans ma page, on m'ecrit comme quoi la variable $section n'est pas définie!!!Je ne sais pas comment le corriger...



    Merci de votre aide bonne journée

  • Photo de profil de zartaj12345

    zartaj12345

    26 January 2017 à 22:07

    @stoppreniumm

    met tout le code dans une seule page...

    et puis ça ira!

  • Photo de profil de bonbek

    bonbek

    09 February 2017 à 11:25

    TU Gèreeeeeeeeeeeeeees <3

  • Photo de profil de jaewook86

    jaewook86

    16 February 2017 à 13:36

    Bonjour !

    C'est un super tuto mais j'aurai une question. Pourquoi l'envoi du code de récupération ne fonctionne pas sur Outlook ?

    Merci à tous ceux qui prendront le temps de me répondre..



  • Photo de profil de loulouweb

    loulouweb

    22 April 2017 à 13:11

    Bonjour,



    Mon probleme est que rien ne rentre dans la table recuperation ! Du coup j'ai forcément le message "code invalide" quand je valide puisqu'il n'est pas présent dans la base. 

    Le code est bien généré et est bien envoyé dans la messagerie.

    QQn peut-il m'aider ? en sachant que c'est exactement le même code que l'auteur !

    Merci

  • Photo de profil de panzer

    panzer

    23 May 2017 à 22:16

    Salut je pense avoir trouver la solution car pour moi tout fonctionne 😀



    Copier-coller le lien et c'est parti: https://www.primfx.com/forum/programmation/php/probleme-que-personne-resoudre-226#m6566



    Bonne journée 😉

  • Photo de profil de aniss

    aniss

    20 March 2018 à 22:48

    Mec, pourquoi t'as pas mis tous tes fichiers (recupration mdp, mail.txt) ???? Je galère comme un chien là. Cela aurait été plus pro de tout mettre en un zip à télécharger.

  • Photo de profil de laraba

    laraba

    04 April 2018 à 17:17

    Merci vraiment super tuto !!!

  • Photo de profil de hitamjaafar

    hitamjaafar

    01 June 2018 à 14:34

    Merci

  • Photo de profil de Citrus

    Citrus

    09 June 2018 à 15:45

    Je tente de tester les codes après les avoir adapté à ma situation mais rien

    Les deux codes sont ils dans le même fichier ?

  • Photo de profil de oge2018

    oge2018

    14 July 2018 à 10:24

    super tuto primfx