Page 1 sur 1

PB MAJ TOKEN

Posté : 15 févr. 2022, 17:16
par nestor94
J'ai un autre soucis sur le script de réinitialisation de mot de passe !
extrait du script
<?php
session_start();
require_once 'config.php';
$msg = '';
if (!empty($_POST)) {	// Si le formulaire a été soumis
	if (!empty($_POST['mail'])) {	// Si le formulaire est correctement rempli
		// On fait une requête pour savoir si l'adresse e-mail est associé à un compte
		$pdostat = $bdd->prepare('SELECT COUNT(*) AS nb FROM membres WHERE mail = ?');
		$pdostat->bindValue(1, $_POST['mail']);
		$pdostat->execute();
 
		$row = $pdostat->fetch(PDO::FETCH_ASSOC);
 
		if (!empty($row) && $row['nb'] > 0) {	// Si l'adresse courriel est associé à un compte
			// On génère notre token
			$string = implode('', array_merge(range('A','Z'), range('a','z'), range('0','9')));
			$token = substr(str_shuffle($string), 0, 20);
 
			// On insère la date et le token dans la base
	$pdostat = $bdd->prepare('UPDATE membres SET password_recov_asked_date = NOW(), password_recovery_token = ? WHERE mail = ?');
	$pdostat->bindValue(1, $token);
	$pdostat->bindValue(2, $email);
//	$pdostat->bindvalue('1',$token ,PDO::PARAM_INT);
//	$pdostat->bindvalue('2',$mail ,PDO::PARAM_STR);
    $pdostat->execute();
..........
c'est la partie UPDATE qui ne se fait pas.
Lorsque je teste, je reçois bien le message mais lors du clic sur le lien, ça m'affiche "le token n'a pas été trouvé"
et effectivement, il n'est pas créé auparavant en table...

Re: PB MAJ TOKEN

Posté : 15 févr. 2022, 18:14
par ynx
Bonjour,

Il semble que la variable $email utilisée dans la fonction bindValue() n'est pas initialisée.

Si c'est pas déjà le cas, penses à activer l'affichage des messages d'erreurs PHP en développement.
Si l'erreur vient bien de là, tu devrais avoir un message "Undefined variable $email..."

Re: PB MAJ TOKEN

Posté : 15 févr. 2022, 18:35
par nestor94
oups, oui avec une variable déclarée, c'est mieux.
<?php
session_start();
$msg = '';
if (!empty($_POST)) {	// Si le formulaire a été soumis
	if (!empty($_POST['mail'])) {	// Si le formulaire est correctement rempli
		// On fait une requête pour savoir si l'adresse e-mail est associé à un compte
		$pdostat = $bdd->prepare('SELECT COUNT(*) AS nb FROM membres WHERE mail = ?');
		$pdostat->bindValue(1, $_POST['mail']);
		$pdostat->execute();
 		$row = $pdostat->fetch(PDO::FETCH_ASSOC);
		if (!empty($row) && $row['nb'] > 0) {	// Si l'adresse courriel est associé à un compte
			// On génère notre token
			$string = implode('', array_merge(range('A','Z'), range('a','z'), range('0','9')));
			$token = substr(str_shuffle($string), 0, 20);
			// On initialise la variable a traiter 
            $mail = $_POST['mail'];
			// On insère la date et le token dans la base
	$pdostat = $bdd->prepare('UPDATE membres SET password_recov_asked_date = NOW(), password_recovery_token = ? WHERE mail = ?');
	$pdostat->bindValue(1, $token);
	$pdostat->bindValue(2, $mail);
    $pdostat->execute();

Re: PB MAJ TOKEN

Posté : 15 févr. 2022, 19:12
par nestor94
dernier soucis dans le script de réinit!!
<?php
session_start();
require_once 'config.php';
$msg = '';
 if (empty($_GET['token'])) {	// Si aucun token n'est spécifié en paramètre de l'URL
	echo 'Aucun token n\'a été spécifié';
	exit;
}
 // On récupère les informations par rapport au token dans la base de données
$pdostat = $bdd->prepare('SELECT password_recov_asked_date FROM membres WHERE password_recovery_token = ?');
$pdostat->bindValue(1, $_GET['token']);
$pdostat->execute();
$row = $pdostat->fetch(PDO::FETCH_ASSOC);
if (empty($row)) {	// Si aucune info associée au token n'est trouvé
	echo 'Ce token n\'a pas été trouvé';
	exit;
}
// On calcul la date de la génération du token + 3hrs
$dateToken = strtotime('+3 hours', strtotime($row['password_recov_asked_date']));
$dateToday = time();
 if ($dateToken < $dateToday) {	// Si la date est dépassé le délais de 3hrs
	echo 'Token expiré !';
	exit;
}
if (!empty($_POST)) {	// Si le formulaire a été soumis
	if (!empty($_POST['password1']) && !empty($_POST['password2'])) {	// Si le formulaire est correctement rempli
		if ($_POST['password1'] === $_POST['password2']) {	// Si les deux mots de passes sont les mêmes
			// On hash le mot de passe
			$password1 = password_hash($_POST['password1'], PASSWORD_DEFAULT);
 			// On met à jour la base de données
			$pdostat = $bdd->prepare('UPDATE membres SET password1 = ?, password_recovery_token = "" WHERE password_recovery_token = ?');
			$pdostat->bindValue(1, $password1);
			$pdostat->bindValue(1, $_GET['token']);
			$pdostat->execute();
 
			$msg = '<div style="color: green;">Le mot de passe a été changé !</div>';
		} else {	// si les deux mots de passe ne sont pas identiques
			$msg = '<div style="color: red;">Les deux mots de passe ne sont pas identiques.</div>';
		}
	} else {
		$msg = '<div style="color: red;">Veuillez remplir tous les champs du formulaire.</div>';
	}
}
?>
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /home/clients/78f15c369c0786c4a419608e9e60028a/web/reinit_password.php:44 Stack trace: #0 /home/clients/78f15c369c0786c4a419608e9e60028a/web/reinit_password.php(44): PDOStatement->execute() #1 {main} thrown in /home/clients/78f15c369c0786c4a419608e9e60028a/web/reinit_password.php on line 44 C'EST DANS L'UPDATE

Re: PB MAJ TOKEN

Posté : 15 févr. 2022, 20:17
par @rthur
Le message d'erreur est trèèèèèèèèès explicite :
Invalid parameter number: number of bound variables does not match number of tokens
Relis ton code ;-)

Re: PB MAJ TOKEN

Posté : 15 févr. 2022, 21:58
par nestor94
:x j'ai regardé durant 1heure et je ne vois pas le problème

Re: PB MAJ TOKEN

Posté : 15 févr. 2022, 22:17
par or 1
$pdostat->bindValue(1, $password1);
$pdostat->bindValue(1, $_GET['token']);

il faut mieux regarder.

Re: PB MAJ TOKEN

Posté : 15 févr. 2022, 22:24
par nestor94
oui, je me doute que l"erreur est là, mais je ne percute pas la soluce.
j'ai tenté
// On met à jour la base de données
			$pdostat = $bdd->prepare('UPDATE membres SET password1 = ?, password_recovery_token = "" WHERE password_recovery_token = ?');
			$pdostat->bindValue(1, $password1);
			$pdostat->bindValue('?', $_GET['token']);
			$pdostat->execute();

Re: PB MAJ TOKEN

Posté : 15 févr. 2022, 22:39
par or 1
que dit la doc ?
et il n'y a même pas besoin de regarder si loin, le 1er message de cette discussion donne la solution.

Re: PB MAJ TOKEN

Posté : 15 févr. 2022, 22:48
par kevin254kl
Comme expliqué https://www.php.net/manual/fr/pdostatem ... dvalue.php soit tu bind avec paramètre nommé soit par ? donc

Code : Tout sélectionner

$pdostat->bindValue(1, $password1); $pdostat->bindValue(2, $_GET['token']);

Re: PB MAJ TOKEN

Posté : 16 févr. 2022, 13:43
par nestor94
Merci messieurs, je devais etre bien épuisé pour ne pas voir l'évidence.

Re: [RESOLU] PB MAJ TOKEN

Posté : 16 févr. 2022, 16:16
par @rthur
Pas de souci, ça nous est tous déjà arrivés :-D