Bonsoir/Bonjour, j'ai actuellement un gros soucis !
Quand je réinitialise un mot de passe par ma page "mdp_oublie.php"
Sa change tous les Mots de passe de la db en celui que l'utilisateur a réinitialisé.
Je ne ces pas d'ou sa peut venir donc je vous passe la page entière
<?php
if(!empty($_POST) && !empty($_POST['email'])){
require_once 'inc/db.php';
require_once 'inc/functions.php';
$req = $pdo->prepare('SELECT * FROM users WHERE email = ? AND confirmed_at IS NOT NULL');
$req->execute([$_POST['email']]);
$user = $req->fetch();
if($user){
session_start();
$reset_token = str_random(60);
$pdo->prepare('UPDATE users SET reset_token = ?, reset_at = NOW() WHERE id =?')->execute([$reset_token, $user->id]);
$_SESSION['flash']['success'] = 'Les instructions du rappel de mot de passe vous ont été envoyé par email';
mail($_POST['email'], 'Réinitialisation de votre mot de passe', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://www.legendhosting.fr/clients/reset.php?id={$user->id}&token=$reset_token");
header('location: connexion.php');
exit();
}else{
$_SESSION['flash']['danger'] = 'Aucun compte ne correspond à cet email';
}
}
?>
<?php require 'inc/header.php'; ?>
<center><ul class="list-group">
<div class="col-lg-45" >
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-title">Mot de passe oublié</h3>
</div>
<div class="panel-body">
<form action="" method="post">
<div class="form-group">
<label for="">Email</label>
<input type="email" name="email" class="form-control"/>
</div>
<button type="submit" class="btn btn-success">Envoyer</button>
</form>
</div>
</div>
</div>
</ul></center>
<?php require 'inc/footer.php'; ?>
Si vous avez besoin de mes autres pages demander moi je ferais tous pour que sa fonctionne.
Merci.
Si tu veux en profiter pour remettre ton token à Null
$id = intval($_GET['id']);
$pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ? ')->execute([ $password,
$id]);
Okay... Cette page ne change pas vraiment le mot de passe, elle permet de gérer le token non ? Le token qui tu gènères est bien seulement affecté à l'utilisateur ayant oublié son mot de passe ?
Ça prendrait la page où il y a le UPDATE users SET password = ? WHERE reset_token = ?
je pense, si tu vois de quoi je parle. (reset.php j'imagine) :-)
Oui ! que je suis bète... ces dans le reset.php
<?php
if(isset($_GET['id']) && isset($_GET['token'])){
require 'inc/db.php';
require 'inc/functions.php';
$req = $pdo->prepare('SELECT * FROM users WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)');
$req->execute([$_GET['id'], $_GET['token']]);
$user= $req->fetch();
if($user){
if(!empty($_POST)){
if(!empty($_POST['password']) && $_POST['password'] == $_POST['password_confirm']){
$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
$pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL')->execute([$password]);
session_start();
$_SESSION['flash']['succes'] = 'Votre mot de passe a bien été modifié';
$_SESSION['auth'] = $user;
header('location: connexion.php');
}
}
}else{
session_start();
$_SESSION['flash']['danger'] = "Ce token n'est pas valide";
header('location: connexion.php');
exit();
}
}else{
header('location: connexion.php');
exit();
}
?>
<?php require 'inc/header.php'; ?>
<center><ul class="list-group">
<div class="col-lg-45" >
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-title">Réinitialiser mon mot de passe</h3>
</div>
<div class="panel-body">
<form action="" method="post">
<div class="form-group">
<label for="">Mot de Passe</label>
<input type="password" name="password" class="form-control"/>
</div>
<div class="form-group">
<label for="">Confirmation du mot de Passe</label>
<input type="password" name="password_confirm" class="form-control"/>
</div>
<button type="submit" class="btn btn-success">Réinitialiser mon mot de passe</button>
</form>
</div>
</div>
</div>
</ul></center>
<?php require 'inc/footer.php'; ?>
Combien je gagne si je te dis que tu n'as pas mis de WHERE dans ta requête update ?
trop facile ce forum !!!, je passe sur stackoverflow :-)
@Huggy: en même temps les gens ne cherchent même plus à résoudre leurs problèmes seuls. Ils viennent directement poster un message... Typiquement dans ce cas dès la lecture du problème 99% des chances que le soucis viennent de la requête ^^
Vu que je suis gentil je vais te le dire:
Il faut mettre le WHERE... dans la requête !
à la fin, WHERE reset_token = ton_token
Donc sa donne sa ?
$pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, WHERE reset_token = NULL')->execute([$password]);
Réflechi quand même à ce que tu veux faire !
Tu veux mettre à jour le mot de passe de ton utilisateur non ? donc peut-être un where avec soit le token ou l'id de l'utilisateur serait judicieux.
Désolé mais je débute vraiment j'ai suivis le tuto de grafikart, j'éssaye de comprend mais ces pas très facile a prendre en main au début...
j'ai le where id
WHERE id =?
Mais j'ai beau le placer après le Set password, sa ne fonctionne pas :(
Essaye ceci
$id = intval($_GET['id']);
$pdo->prepare('UPDATE users SET password = ?, reset_at = NULL WHERE id = ? ')->execute([ $password,
$id]);
Ces parfait ! Je te remercie , je ces que ces un truc tout con , mais je débute vraiment et j'ai tourné en rond pendant bien 2h :D