Bonjour,
Voila je rencontre un petit problème avec mon code.
Ce que je fais
Je suis le turoriel sur la gestion d'un espace membre, d'abord en procédurale, la partie 1 quoi.
Mon code fonctionne. Les données s'enregistrent dans la base de donnée, la confirmation par une clef de vérification fonctionne.
Seulement, je dois alerter l'utilisateur que :
- Un mail à été envoyé pour confirmer le compte.
- Que cette clef de validation est invalide.
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!