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


Huggy
Réponse acceptée

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

Nucky
Auteur

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

Nucky
Auteur

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

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
Auteur

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.

Nucky
Auteur

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
Auteur

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

Essaye ceci

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

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

Nucky
Auteur

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