Bonjour,
j'ai créé un espace membre à l'aide des tutos de Grafikart, l'inscription, la réception de l'email pour la confirmation du compte, la connexion et la déconnexion fonctionne, mais je rencontre un problèmes avec le mot de passe oublié.
Quand je clic sur "j'ai oublié mon mot de passe" je tombe sur la page "forget.php" Mot de passe oublié, j'entre mon adresse email, j'envoie, je tombe sur la page "longin.php" avec le message suivant "Les instructions du rappel de mot de passe vous ont été envoyées par emails " Le problème s'est que je ne reçoit pas de mail. j'ai regardé dans ma base de donnés, le token est généré pour le changement de mot de passe
Ci dessous le code de la page "forget.php", la page ou j'entre mon adresse email. Je pense que c'est cette pâge qui doit généré l'envoie de l'email, sinon dites moi quelle page peut être à l"origine du problème.
<?php
require 'inc/bootstrap.php';
if(!empty($_POST) && !empty($_POST['email'])){
$db = App::getDatabase();
$auth = App::getAuth();
$session = Session::getInstance();
if($auth->resetPassword($db, $_POST['email'])){
$session->setFlash('success', 'Les instructions du rappel de mot de passe vous ont été envoyées par emails');
App::redirect('login.php');
} else {
$session->setFlash('danger', 'Aucun compte ne correspond à cet adresse');
}
}
?>
<?php require 'inc/header.php'; ?>
<h1>Mot de passe oublié</h1>
<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-primary">Se connecter</button>
</form>
<?php require 'inc/footer.php'; ?>
Bonsoir.
Pour ma part, je ne vois pas pourquoi tu fais deux fois une requête SQL pour modifier le champ password
, ici :
$pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user->id]);
et ici :
$db->query('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?', [$password, $_GET['id']]);
Il est tout à fait normal que tu aies cette erreur, étant donné que dans le premier tu utilises un objet pdo
qui n'est pas initialisé dans ton fichier contrairement à l'objet db
(dans le second).
C'est bien de suivre des tutoriels pour apprendre seul, mais il faudrait que vous les compreniez en retour.
Bonjour,
Tu as un serveur mail sur ta machine local ? Si non c'est tout a fait normal, teste sur un serveur web distant.
Cordialement,
TJ_
Bonsoir.
Pour commencer, ce n'est pas cette page qui traite l'envoi de l'email, mais plutôt dans la classe Auth
et plus précisément la fonction resetPassword
.
Vérifies bien ta configuration pour l'envoi d'email.
Bonjour,
En effet, il y avait une erreur dans l'adresse du fichier "Auth" dans la fonction "resetPassword", j'ai corrigé l'erreur
Maintenant le mail pour la réinitialisation du mot de passe est bien envoyé et reçu, je clic sur le lien, je tombe sur la page de réinitilisation, je change mon mot de passe, j'envoie et ce message d'erreur
Fatal error: Call to a member function prepare() on null in /home/xxxxx/www/EM/reset.php on line 10
Voici le fichier "reset.php"
<?php
ini_set('display_errors',1);
require 'inc/bootstrap.php';
if(isset($_GET['id']) && isset($_GET['token'])){
$auth = App::getAuth();
$db = App::getDatabase();
$user = $auth->checkResetToken($db, $_GET['id'], $_GET['token']);
if($user){
if(!empty($_POST)){
$pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user->id]);
$validator = new Validator($_POST);
$validator->isConfirmed('password');
if($validator->isValid()){
$password = $auth->hashPassword($_POST['password']);
$db->query('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?', [$password, $_GET['id']]);
$auth->connect($user);
Session::getInstance()->setFlash('success','Votre mot de passe a bien été modifié');
App::redirect('account.php');
}
}
}else{
Session::getInstance()->setFlash('danger',"Ce token n'est pas valide");
App::redirect('login.php');
}
}else{
App::redirect('login.php');
}
?>
<?php require 'inc/header.php'; ?>
<h1>Réinitialiser mon mot de passe</h1>
<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-primary">Réinitialiser votre mot de passe</button>
</form>
<?php require 'inc/footer.php'; ?>
Le ligne 10 est celle-ci
$pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user->id]);
Je ne vois pas d'erreur sur cette ligne
Il est assez compliqué ce tuto pour moi et j'ai beaucoyp de mal à comprendre certaines choses. En effet la requête est doublée, mais laquelle est ce je dois garder. D'après ton message la première ne peut pas fonctionné vu que tu dis quelle n'est pas initialisé.
Bonsoir,
J'ai supprimé la première requête, ça fonctionne à merveille.
merci beaucoup pour l'aide apporté.