bug MOT DE PASSE OUBLIÉ
- Accueil
- Forum
- Programmation
- PHP
- bug MOT DE PASSE OUBLIÉ
Rudelle65 Le 27 avril 2016 à 03:47 (Édité le 25 janvier 2019 à 17:50)
j'ai suivit le tuto de PrimFx MOT DE PASSE OUBLIÉ https://www.primfx.com/article/tuto-php-mot-passe-oublie-231 l'email s'envoi bien avec le code mais quand je met dans l'url ?section=code ou ?section=changemdp sa na change pas de formulaire c'est toujour celui ou je doit mettre mon email
La page de mon site en question: http://tweetbook.no-ip.org/recuperation.php
mon code:
<?php include("inc/header.php"); ?>
<br/><br/><br/><br/>
<center>
<meta charset="UTF-8">
<?php
require_once('php/config.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:"TweetBook"<delmer.severine@orange.fr>'."\n";
$header.='Content-Type:text/html; charset="uft-8"'."\n";
$header.='Content-Transfer-Encoding: 8bit';
$message='
<html>
<head>
<title>Récupération de mot de passe - TweetBook</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://TweetBook.no-ip.org/">TweetBook</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 - TweetBook", $message, $header);
header("Location: 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: 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: login.php');
} 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";
}
}
?>
<div class="container">
<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 '<div class="alert alert-danger" role="alert"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true">'.$error.'</span>'; } else { echo ""; } ?>
</center>
<br/><br/><br/><br/>
<?php include("inc/footer.php"); ?>
guewen Le 27 avril 2016 à 08:55 (Édité le 1 janvier 1970 à 01:00)
Rudelle65 Le 28 avril 2016 à 01:05 (Édité le 28 avril 2016 à 01:17)
[Thu Apr 28 01:04:29.403532 2016] [:error] [pid 7352:tid 1076] [client 192.168.1.19:60009] PHP Notice: Undefined variable: section in F:\\EasyPHP-Webserver-14.1b2\\www\\recuperation.php on line 134, referer: http://192.168.1.22:8080/recuperation.php
[Thu Apr 28 01:04:29.403532 2016] [:error] [pid 7352:tid 1076] [client 192.168.1.19:60009] PHP Notice: Undefined variable: section in F:\\EasyPHP-Webserver-14.1b2\\www\\recuperation.php on line 141, referer: http://192.168.1.22:8080/recuperation.php
BeKidding Le 1 mai 2016 à 01:22 (Édité le 1 mai 2016 à 01:41)
JxSDev Le 2 mai 2016 à 12:32 (Édité le 2 mai 2016 à 12:33)
pour mon cas, c'est undefined index $recup_mail il envoi l'email mais après rien ne marche , je suis coincée là dedans pendant presque 3 ou 4 jours --'
JxSDev Le 3 mai 2016 à 10:52 (Édité le 1 janvier 1970 à 01:00)
Tout d'abord, il faut que tu mettes ça après ton session_start() :
if(isset($_GET['section']))
{
$section = $_GET['section'];
}
Puis remplace ça : <?php if($section == 'code') { ?>
par ça :<?php if(isset($_GET['section']) && $_GET['section'] == 'code') { ; ?>
pareil pour changmdp :
<?php } elseif(isset($_GET['section']) && $_GET['section'] == "changemdp"){ ?>
Voila, j'espère que ça va t'aider 😀
Clouder Le 3 mai 2016 à 12:01 (Édité le 1 janvier 1970 à 01:00)
S'il faut je peux faire un petit tuto vite fait sur l'oubli de mot de passe et la mettre sur ma chaine Youtube !
Et j'avais oublié l'envoie de message mail en localhost ne marche pas. (Il faut l'activé dans vos paramètres et installer un logiciel tier)
La fonction ne marche que en ligne 😀
joris1904 Le 7 mai 2016 à 23:21 (Édité le 8 mai 2016 à 00:08)
mon code
<?php
require_once('php/config.php'); /* Mes fonctions */
require_once('views/recuperation.view.php'); /* Mes fonctions */ ?>
<?php
session_start();
if(isset($_GET['section']))
{
$section = $_GET['section'];
}
if(isset($_GET['section'])) {
$section = htmlspecialchars($_GET['section']);
} else {
$section = "";
}
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:"Jorisvideo.fr"<support@jorisvideo.fr>'."\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 - JorisVideo.fr</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> ou Cliquez <a href="http://forum.jorisvideo.fr/recuperation.php?section=code&code='.$recup_code.'">ici</a> pour réinitialiser votre mot de passe
A bientôt sur <a href="http://jorisvideo.fr/">JorisVideo.fr</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 - JorisVideo.fr", $message, $header);
header("Location: 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: 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:forum.jorisvideo.fr/connexion.php');
} 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";
}
}
?>
Ranarxhag Le 8 mai 2016 à 00:34 (Édité le 8 mai 2016 à 00:34)
Bon, le début de ton code est un beau bordel 😋
Tout d'abord, le session_start(), tu le mets avant TOUT. Pas de include avant ou de fermeture de la balise PHP. S'il n'est pas mis au début, ta session ne démarrera pas.
Ensuite, pourquoi faire les include en haut puis fermer la balise PHP pour en ré-ouvrir une juste en dessous ? Tu vas avoir de sérieux problèmes avec tes redirections alors certes, ça fonctionne peut-être en local mais à peine passé sur hébergeur (sauf exception), ça ne fonctionnera plus.
Je te renvoie vers la doc car elle est très bien expliquée --> http://php.net/manual/fr/function.header.php
Prend vraiment la peine de lire un peu et tu comprendras tout.
Enfin, juste après le session_start() que tu as mis, pourquoi fais-tu les choses en deux fois au niveau de la variable GET alors que tu pourrais tout faire en une fois ?
Du coup, petite correction s'impose :
<?php
session_start(); // On le met avant tout le code. Rien avant !!!!!
require_once('php/config.php'); /* Mes fonctions */
require_once('views/recuperation.view.php'); /* Mes fonctions */
if(isset($_GET['section'])) {
$section = htmlspecialchars($_GET['section']);
} else {
$section = "";
}
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:"Jorisvideo.fr"<support@jorisvideo.fr>'."\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 - JorisVideo.fr</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> ou Cliquez <a href="http://forum.jorisvideo.fr/recuperation.php?section=code&code='.$recup_code.'">ici</a> pour réinitialiser votre mot de passe
A bientôt sur <a href="http://jorisvideo.fr/">JorisVideo.fr</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 - JorisVideo.fr", $message, $header);
header("Location: 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: 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:forum.jorisvideo.fr/connexion.php');
} 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";
}
}
?>
Voilà, je n'ai pas vraiment regardé la suite du code mais les tutoriels de PrimFX sont très clairs donc si tu as fais comme lui pour le reste, ça devrait le faire 😉 Et tu auras remarqué que ta balise PHP est ouverte en début de code et qu'elle est fermée tout à la fin. Pas une fois elle n'a été fermée puis ré-ouverte dans le code et c'est absolument une habitude à prendre de ne jamais fermer les balises trop tôt sinon, gare aux problèmes ! 😀
J'espère m'être exprimée de façon claire 😄
Amicalement,
Ranarxhag
joris1904 Le 8 mai 2016 à 01:23 (Édité le 1 janvier 1970 à 01:00)
[/url]
Ranarxhag Le 8 mai 2016 à 10:56 (Édité le 8 mai 2016 à 12:12)
EDIT : On pourrait avoir ton code HTML ?
joris1904 Le 8 mai 2016 à 12:11 (Édité le 1 janvier 1970 à 01:00)
Ranarxhag Le 8 mai 2016 à 12:20 (Édité le 8 mai 2016 à 12:23)
EDIT : Ah ben non.. je ne peux pas le confirmer car il ne se crée pas en base de donnée je pense étant donné que j'ai pu créer 2 fois le compte avec le même pseudo et même mail. De plus, si je change la variable section dans l'url, ça m'affiche bien les formulaires respectifs.
joris1904 Le 8 mai 2016 à 12:27 (Édité le 1 janvier 1970 à 01:00)
<h4 class="title-element">Récupération de mot de passe</h4>
<?php if(isset($_GET['section']) && $_GET['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(isset($_GET['section']) && $_GET['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 ""; } ?>
joris1904 Le 8 mai 2016 à 17:21 (Édité le 1 janvier 1970 à 01:00)
joris1904 Le 8 mai 2016 à 21:02 (Édité le 8 mai 2016 à 21:38)
Je crois que le problème viens d'ici avec "SELECT confirme" $verif_confirme = $bdd->prepare('SELECT confirme FROM recuperation WHERE mail = ?');
Edit: Le problème était que je n'avais pas créer 'confirme' dans ma basse