[RESOLU] PB MAJ TOKEN

Eléphant du PHP | 345 Messages

15 févr. 2022, 17:16

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...

ynx
Mammouth du PHP | 586 Messages

15 févr. 2022, 18:14

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..."

Eléphant du PHP | 345 Messages

15 févr. 2022, 18:35

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();

Eléphant du PHP | 345 Messages

15 févr. 2022, 19:12

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

15 févr. 2022, 20:17

Le message d'erreur est trèèèèèèèèès explicite :
Invalid parameter number: number of bound variables does not match number of tokens
Relis ton code ;-)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 345 Messages

15 févr. 2022, 21:58

:x j'ai regardé durant 1heure et je ne vois pas le problème

Mammouth du PHP | 2703 Messages

15 févr. 2022, 22:17

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

il faut mieux regarder.

Eléphant du PHP | 345 Messages

15 févr. 2022, 22:24

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();

Mammouth du PHP | 2703 Messages

15 févr. 2022, 22:39

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.

Eléphant du PHP | 385 Messages

15 févr. 2022, 22:48

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']);

Eléphant du PHP | 345 Messages

16 févr. 2022, 13:43

Merci messieurs, je devais etre bien épuisé pour ne pas voir l'évidence.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

16 févr. 2022, 16:16

Pas de souci, ça nous est tous déjà arrivés :-D
Quand tout le reste a échoué, lisez le mode d'emploi...