Ce site utilise des cookies pour améliorer uniquement votre expérience utilisateur.
Vous pouvez lire à tout moment comment nous utilisons les cookies sur le site.
Il arrivera souvent qu'un utilisateur oublie son mot de passe. Pour y remédiez nous allons modifier notre base de données avec un nouveau paramètre nous permettant de savoir si l'utilisateur à oui ou non fait une demande de nouveau mot de passe.
Ensuite, nous allons créer un nouveau formulaire ou l'utilisateur saisi son mail et une fois celui-ci validé et confirmé il recevra un nouveau mot de passe par mail avec une mise à jour de son ancien vers son nouveau mot de passe dans notre base de données.
Page motdepasse.php
CREATE TABLE utilisateur (
id int(255) unsigned NOT NULL AUTO_INCREMENT,
nom varchar(50) DEFAULT NULL,
prenom varchar(50) DEFAULT NULL,
mail varchar(191) DEFAULT NULL,
mdp text,
date_creation_compte datetime DEFAULT NULL,
n_mdp int(1) DEFAULT 0; // Permet de savoir si on a fait une demande de mot de passe
PRIMARY KEY (id),
UNIQUE KEY mail (mail)
)
<?php
session_start();
include('bd/connexionDB.php');
if (isset($_SESSION['id'])){
header('Location: index.php');
exit;
}
if(!empty($_POST)){
extract($_POST);
$valid = true;
if (isset($_POST['oublie'])){
$mail = htmlentities(strtolower(trim($mail))); // On récupère le mail afin d envoyer le mail pour la récupèration du mot de passe
// Si le mail est vide alors on ne traite pas
if(empty($mail)){
$valid = false;
$er_mail = "Il faut mettre un mail";
}
if($valid){
$verification_mail = $DB->query("SELECT nom, prenom, mail, n_mdp
FROM utilisateur WHERE mail = ?",
array($mail));
$verification_mail = $verification_mail->fetch();
if(isset($verification_mail['mail'])){
if($verification_mail['n_mdp'] == 0){
// On génère un mot de passe à l'aide de la fonction RAND de PHP
$new_pass = rand();
// Le mieux serait de générer un nombre aléatoire entre 7 et 10 caractères (Lettres et chiffres)
$new_pass_crypt = crypt($new_pass, "$6$rounds=5000$macleapersonnaliseretagardersecret$");
// $new_pass_crypt = crypt($new_pass, "VOTRE CLÉ UNIQUE DE CRYPTAGE DU MOT DE PASSE");
$objet = 'Nouveau mot de passe';
$to = $verification_mail['mail'];
//===== Création du header du mail.
$header = "From: NOM_DE_LA_PERSONNE <no-reply@test.com> \n";
$header .= "Reply-To: ".$to."\n";
$header .= "MIME-version: 1.0\n";
$header .= "Content-type: text/html; charset=utf-8\n";
$header .= "Content-Transfer-Encoding: 8bit";
//===== Contenu de votre message
$contenu = "<html>".
"<body>".
"<p style='text-align: center; font-size: 18px'><b>Bonjour Mr, Mme".$verification_mail['nom']."</b>,</p><br/>".
"<p style='text-align: justify'><i><b>Nouveau mot de passe : </b></i>".$new_pass."</p><br/>".
"</body>".
"</html>";
//===== Envoi du mail
mail($to, $objet, $contenu, $header);
$DB->insert("UPDATE utilisateur SET mdp = ?, n_mdp = 1 WHERE mail = ?",
array($new_pass_crypt, $verification_mail['mail']));
}
}
header('Location: connexion.php');
exit;
}
}
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mot de passe oublié</title>
</head>
<body>
<div>Mot de passe oublié</div>
<form method="post">
<?php
if (isset($er_mail)){
?>
<div><?= $er_mail ?></div>
<?php
}
?>
<input type="email" placeholder="Adresse mail" name="mail" value="<?php if(isset($mail)){ echo $mail; }?>" required>
<button type="submit" name="oublie">Envoyer</button>
</form>
</body>
</html>
Vu que l'on a rajouté un paramètre qui permet de savoir si oui ou non on a fait une demande de nouveau mot de passe lorsque l'utilisateur se connectera sur la page connexion.php il faudra remettre à 0 sa demande de nouveau mot de passe.
Page connexion.php
...
$req = $DB->query("SELECT * FROM utilisateur WHERE mail = ? AND mdp = ?",
array($mail, crypt($mdp, "$6$rounds=5000$macleapersonnaliseretagardersecret$")));
// array($mail, crypt($mdp, "VOTRE CLÉ UNIQUE DE CRYPTAGE DU MOT DE PASSE")));
$req = $req->fetch();
// Si on a pas de résultat alors c'est qu'il n'y a pas d'utilisateur correspondant au couple mail / mot de passe
if (!isset($req['id'])){
$valid = false;
$er_mail = "Le mail ou le mot de passe est incorrecte";
}elseif($req['n_mdp'] == 1){ // On remet à zéro la demande de nouveau mot de passe s'il y a bien un couple mail / mot de passe
$DB->insert("UPDATE utilisateur SET n_mdp = 0 WHERE id = ?",
array($req['id']));
}
...