Gros soucis codage

Par Nucky, il y a 10 ans


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.

14 réponses

Ramzz1994, il y a 10 ans

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) :-)

Nucky, il y a 10 ans

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'; ?>
Huggy, il y a 10 ans

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 :-)

shinix, il y a 10 ans

@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 ^^

Nucky, il y a 10 ans

Je suis débutant, merci de me dire ou mêttre le Where svp.

Balthazar Fernandez, il y a 10 ans

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

Nucky, il y a 10 ans

Donc sa donne sa ?

$pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, WHERE reset_token = NULL')->execute([$password]);
shinix, il y a 10 ans

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.

Nucky, il y a 10 ans

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 :(

Nucky, il y a 10 ans

Une personne pour m'apprendre vite fais comment faire ou nan ?

Huggy, il y a 10 ans

Essaye ceci

$id = intval($_GET['id']); $pdo->prepare('UPDATE users SET password = ?, reset_at = NULL WHERE id = ? ')->execute([ $password, $id]);
Nucky, il y a 10 ans

Je vais tester, mais pour le reste token ces bon ?

Huggy, il y a 10 ans

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]);
Nucky, il y a 10 ans

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