Bonjour,
Voila je rencontre un petit problème avec mon code.
Décrivez ici votre code ou ce que vous cherchez à faire
<?php if(session_status() == PHP_SESSION_NONE){
session_start();
}
require 'includes/function_register.php'; ?>
<?php if(isset($_GET['id']) && isset($_GET['token'])){
require_once 'includes/db.php';
require_once 'includes/function_register.php';
$req = $pdo->prepare('SELECT * FROM Membres 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 Membres SET password = ?, reset_at = NULL, reset_token = NULL')->execute([$password]);
session_start();
$_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié';
$_SESSION['auth'] = $user;
header('Location: account.php');
exit();
}
else{
$_SESSION['flash']['danger'] = "Les mots de passe ne correspondent pas";
}
}
}else{
session_start();
$_SESSION['flash']['danger'] = "Ce lien n'est pas ou plus valide";
header('Location: login.php');
exit();
}
}else{
header('Location: login.php');
exit();
} ?>
Entourez votre code avec ce symbole ```
### Ce que je veux
Cela change tout les mots de passes de tout les id alors que j'aimerai que ce soit l'id en question uniquement.
### Ce que j'obtiens
Cela change tout les mots de passe de tout les id ...
C'est parce que à cette ligne là:
$pdo->prepare('UPDATE Membres SET password = ?, reset_at = NULL, reset_token = NULL')->execute([$password]);
Dans la requête, tu ne précise pas quel membre doit être modifié, donc il les modifie tous. Tu devrais avoir quelque chose dans ce genre pour que ton problème soit résolu:
$pdo->prepare('UPDATE Membres SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = 25')->execute([$password]);
ou
$pdo->prepare("UPDATE Membres SET password = ?, reset_at = NULL, reset_token = NULL WHERE email = 'mon-email@mail.com'")->execute([$password]);
Bonsoir.
C'est tout à fait normal, étant donné que dans ta requête pour l'update, tu ne définis pas quel enregistrement il doit modifier.
Il te faut donc par exemple modifier :
$pdo->prepare('UPDATE Membres SET password = ?, reset_at = NULL, reset_token = NULL')->execute([$password]);
Par :
$pdo->prepare('UPDATE Membres SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?')->execute([$password, $user->id]);
ah d'accord, j'ai pourtant suivi à la lettre le tuto ^^
je vais tester et te dire ce que ça donne =)
en tout cas merci
Super !
ça fonctionne parfaitement =)
enfaite j'avais bien compris que l'id n'était pas défni mais je trouvais pas comment faire.
Merci encore pour tout =)
Peut continuer à échanger ?
Tant que j'y pense, lorsque je reçois un mail, l'expéditeur est CGI-mailer. Je sais que c'est l'adresse de mon hébergeur.
Comment changer cela ?
Je connais la technique mail($to, subject, ...)
Mais je ne sais pas comment l'intégrer.
Aurais-tu une astuce ?
Merci pour vos réponses.
Tant que j'y pense, lorsque je reçois un mail, l'expéditeur est CGI-mailer. Je sais que c'est l'adresse de mon hébergeur.
Comment changer cela ?
Je connais la technique mail($to, subject, ...)
Mais je ne sais pas comment l'intégrer.
Aurais-tu une astuce ?
Salut,
mail($to, $subject, ...)
Tu as bien précisé le $from aussi hein..?
[EDIT]
Mais je ne sais pas comment l'intégrer.
??
Attends, en fait tu n'as pas encore utilisé la fonction "mail()" ?
lorsque je reçois un mail
Tu envoies bien des emails pourtant.
Comment tu envoies des emails en ce moment ?
Enfaite c'est cette ligne la que j'aimerai modifier :
mail($_POST['email'], 'Réinitiatilisation de votre mot de passe', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://www.cdbf.fr/reset.php?id={$user->id}&token=$reset_token");
D'après ce que j'ai compris on ne peut pas mettre de from dedans car c'est une requête simple.
Du coup je pensais mettre mail($to, $subject, $header, ...) mais je ne vois pas comment l'intégrer dans :
<?php session_start();
require 'includes/function_register.php'; ?>
<?php if(!empty($_POST) && !empty($_POST['email'])){
require_once 'includes/db.php';
require_once 'includes/function_register.php';
$req = $pdo->prepare('SELECT * FROM Membres 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 Membres 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ées par emails';
mail($_POST['email'], 'Réinitiatilisation de votre mot de passe', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://www.cdbf.fr/reset.php?id={$user->id}&token=$reset_token");
header('Location: login.php');
exit();
}else{
$_SESSION['flash']['danger'] = 'Aucun compte ne correspond à cet adresse';
}
} ?>
Ah oui excuse-moi,
c'est vrai que le "from" n'est pas un paramètre direct de la fonction mail(), j'avais oublié.
Il faut le mettre dans le header (4ème paramètre et optionnel)
N'hésites pas à regarder le manual hein, il y a un exemple qui te montres comment utiliser ce 4ème paramètre.
http://php.net/manual/fr/function.mail.php
PS : essaie de mettre ton code à l'intérieur des balises de code.
N'hésites pas à regarder le manual hein, il y a un exemple qui te montres comment utiliser ce 4ème paramètre.
http://php.net/manual/fr/function.mail.php
Ah ben attends, tu exagères là, tu ne peux pas poser cette question... :'(
Va voir le lien que je t'ai donné,
regardes l'exemple #2
Prends le réflexe d'aller voir le manual de PHP pour comprendre une fonction, quand tu ne la connait pas (ou que tu as un problème avec), c'est important.
Ça doit devenir automatique.
Le truc c'est que j'ai un double problème ...
j'ai le souci du from et le souci de SMTP.
Avec cette exemple quand j'envois depuis un yahoo mail ou reçoit d'un yahoo mail ça devient un SPAM.
du coup je peux pas l'utiliser )=
Voila pourquoi je bloque un peu.
Après j'avais réussi une fois mais le lient ne s'affichait pas dans le mail.
Du moins il affichait pas pas le token )=
Du coup en gros je tourne en rond ...
Donc au final c'est pas que je comprends pas ou que je vois pas d'ou le souci est.
C'est qu'à chaque fois un paramètre bloque et je ne sais pas toujours pourquoi
Ah mince, tu parles de l'exmple 2 du lien ?
Quand tu envoies avec 'from' dans le $header, le mail va dans les spams ?
Et quand tu envoie sans le $header, le mail reçu indique que l'expéditeur est ton hébergeur ?
C'est ça ?
C'est bizarre, je ne vois pas pourquoi.
Zut, je connais trop mal les mails, je ne pense pas pouvoir aider.
Alors j'ai régler mon problème de from cependant j'ai toujours mon souci de SMTP si je ne me trompe pas.
Enfaite quand j'envois et reçoit des maisl de yahoo et bien ça pase en spam et du coup je vois pas comment égler cela )=