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 :

  1. Un mail à été envoyé pour confirmer le compte.
  2. 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!

3 réponses


Bonjour,

  • La fonction mail te retourne quelque chose (true ou false), il serait bien de tester ce retour
  • As-tu renseigné le smtp dans le fichier php.ini ?
  • Il manque le "headers" à ton mail (cf doc php de la fonction mail)

Bonjour,
Merci pour votre réponse. Je prend note des remarques concernant la fonction mail et le fichier php.ini.
Mon problème concerne cependant cette variable $_SESSION['flash'] qui transite entre mon fichier config.php et mon fichier login.php mais pas entre mon fichier register.php et mon fichier login.php. Je ne comprend pas cette différence.

Bonjour Thérèse,

Ta variable $_SESSIONne devrait pas changer entre les différents fichiers.
Dans ta confirmation, tu pourrais peut-être mettre ton session_start() au début du fichier.
As-tu essayé un var_dump($_SESSION) dans ton header pour voir ce qu'il contenait ?