Bonjour,
Voila je rencontre un petit problème avec mon code. Je cherche à créer un système d’alerte par une sessions que j’appelle flash afin d’avertir l’utilisateur de : 1. Un mail à été envoyé pour confirmer le compte. 2. Que la clef de validation est invalide si c’est le cas
Une technique assez simple :
Si jamais le compte est créé, je créé une session flash :
$_SESSION['flash']['succes'] = "Un mail de confirmation vous a été envoyé!";
Si jamais une session flash existe, je l’affiche sur mon site.
Le petit message "flash" comme quoi la clef est invalide fonctionne mais pas le petit message pour la confirmation du compte.
Mon register :
<?php session_start(); ?>
<?php require 'inc/functions.php'; ?>
<?php require 'inc/db.php'; ?>
<?php
if(!empty($_POST)) {
$errors = array();
// Vérifions que le Pseudo est valide.
if(empty($_POST{'username'}) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])){
$errors['username'] = "Votre pseudo n'est pas valide.";
} else // Vérifions que le pseudo n'est pas déjà utilisé.
{
$req = $pdo->prepare('SELECT id FROM users WHERE username = ?');
$req->execute([$_POST['username']]);
$user = $req->fetch();
if($user) {
$errors['username'] = 'Ce pseudo est déjà pris';
}
}
// Vérifions que l'email est valide.
if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$errors['email'] = "Votre email n'est pas valide.";
} // Vérifions que l'email est valide.
else {
$req = $pdo->prepare('SELECT id FROM users WHERE email = ?');
$req->execute([$_POST['email']]);
$user = $req->fetch();
if($user) {
$errors['email'] = 'Cet email est déjà pris';
}
}
if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']) {
$errors['password'] = "Votre mot de passe est incorrect.";
}
if(empty($errors)) {
$req = $pdo->prepare("INSERT INTO users SET username = ?, password = ?, email = ?, confirmation_token = ?");
$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
$token = str_random(60);
$req->execute([$_POST['username'], $password, $_POST['email'], $token]);
$user_id = $pdo->lastInsertId();
mail($_POST['email'], "Confirmation de votre email', 'Pour valider ton compte clique sur ce lien : \n\n http://localhost/Bug/confirm.php?id=$user_id&token=$token");
$_SESSION['flash']['succes'] = "Un mail de confirmation vous a été envoyé!";
header('Location: login.php');
}
}
?>
Ma page de confirmation :
<?php
$user_id = $_GET['id'];
$token = $_GET['token'];
require 'inc/db.php';
$req = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$req->execute([$user_id]);
$user = $req->fetch();
session_start();
if($user && $user->confirmation_token == $token){
$req = $pdo->prepare('UPDATE users SET confirmation_token = NULL, confirmated_at = NOW() WHERE id = ?')->execute([$user_id]);
$_SESSION['auth'] = $user;
header('Location: account.php');
} else {
$_SESSION['flash']['danger'] = "Ce token n'est plus valide";
header('Location: login.php');
}
Ma page de login :
<?php require 'inc/functions.php'; ?>
<?php require 'inc/db.php'; ?>
<?php session_start(); ?>
<!-- Header -->
<?php require 'inc/header.php'; ?>
<!-- end Header -->
<h1> Espace membre </h1>
<!-- footer -->
<?php require 'inc/footer.php'; ?>
<!-- end footer -->
</body>
</html>
mon header : (la partie concernée du header par ce message d’alerte)
<?php if(isset($_SESSION['flash'])): ?>
<?php foreach ($_SESSION['flash'] as $type => $message): ?>
<div class ="alert alert-<?= $type; ?>"> <?= $message; ?></div>
<?php endforeach; ?>
<?php unset($_SESSION['flash']); ?>
<?php endif; ?>
Le message d’alerte "Flash" concernant l’invalidité du token fonctionne correctement, pas le message "Flash" concernant l’envoie d’une clef de confirmation. En définitif, la variable $_SESSION['flash'] est vide quand elle vient de register.php mais pas quand elle vient de confirm.php vers login.php Merci pour votre aide!