Bonjour,

Voila je rencontre un petit problème avec mon code.

Un probleme persistant depuis deux jours

bonjours à tous, voila je rencontre un petit probleme assez embetant ..

quands je m'inscris directement je recois le $_debug sans rien d'autre avec :


(
    [flash] => Array
        (
            [success] => Un email de confirmation vous a été envoyé pour valider votre compte
            [danger] => Ce lien n'est plus valide
        )

    [auth] => stdClass Object
        (
            [id] => 16
            [username] => hihi
            [email] => blablabla@blablal.fr
            [password] => $2y$10$QC8AXcu/eIaEFDj9GF3zseHXmjtyCI7g0TEc62a41iFW7H.qgNs9a
            [confirmation_token] => MLDhn1heFxuROoS8KJuVA7vxA5IyebRSe1b3AY53mML68yKGb5uzVlFHkxOB
            [confirmed_at] => 
        )

)

( rediriger directement sur la page login)

Lorsque je valide le compte donc account.php: 

Array
(
    [flash] => Array
        (
            [success] => Votre compte a bien été validé
            [danger] => Ce lien n'est plus valide
        )

    [auth] => stdClass Object
        (
            [id] => 17
            [username] => hihi
            [email] => blablabla@blablal.fr
            [password] => $2y$10$J3hAP8ZzIn.ypsoD26yYVuofggdOVWkkih5MTs.Sow9K/YqDuHjhC
            [confirmation_token] => Q3T8LTLtFHCn2t0Q14a6VjaTNMhg3t9bVikN4EqKLjx2rU2VXgk46G5UHalm
            [confirmed_at] => 
        )

)

déjà je remarque que l'id augmente de 1 je ne sais pas pourquoi .. 

je valide une deuxieme fois .. 

Array
(
    [flash] => Array
        (
            [success] => Votre compte a bien été validé
            [danger] => Ce lien n'est plus valide
        )

    [auth] => stdClass Object
        (
            [id] => 17
            [username] => hihi
            [email] => blablabla@blablal.fr
            [password] => $2y$10$J3hAP8ZzIn.ypsoD26yYVuofggdOVWkkih5MTs.Sow9K/YqDuHjhC
            [confirmation_token] => Q3T8LTLtFHCn2t0Q14a6VjaTNMhg3t9bVikN4EqKLjx2rU2VXgk46G5UHalm
            [confirmed_at] => 
        )

)```

sans autre message ' flash '

et la page login bah j'ai toujours le meme message ... 

donc en realité la fonction $debug est omni présente lol vous aurez une idée ? ( pour le moment je veux chercher tout seul) mais serait il une mauvaise frappe ? Ou j'ai loupé une etapes ? 

Le register.php si vous voyez l'erreur et me confirmer que c'est dedans lol :

```<?php

require_once 'inc/functions.php';
session_start();

if (!empty($_POST)){

    $errors = array();
        require_once 'db.php';

if (empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])){

    $errors ['username'] = "vous n'avez pas entrer de nom";

} else {

    $req = $pdo->prepare('SELECT id FROM users WHERE username = ?');

    $req->execute([$_POST['username']]);

    $user = $req->fetch();

    if($user){

            $errors['username'] = 'Ce nom est déjà pris';
    }

}

if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){

    $errors['email'] = "votre email n'est pas 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 pour un autre compte';
    }

}

if(empty($_POST['password'])|| $_POST['password'] != $_POST['password_confirm']){

    $errors['password'] = "Vous devez rentrer un mot de passe identique";
}

    if(empty($errors)){

    // On enregistre les informations dans la base de données 
    $req = $pdo->prepare("INSERT INTO users SET username = ?, password = ?, email = ?, confirmation_token = ?");
    // On ne sauvegardera pas le mot de passe en clair dans la base mais plutôt un hash
    $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
    // On génère le token qui servira à la validation du compte 
    $token = str_random(60);
    $req->execute([$_POST['username'], $password, $_POST['email'], $token]);
    $user_id = $pdo->lastInsertId();
    // On envoit l'email de confirmation
    mail($_POST['email'], 'Confirmation de votre compte CGT', "Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://cgtchiv.pe.hu/confirm.php?id=$user_id&token=$token");
    // On redirige l'utilisateur vers la page de login avec un message flash
    $_SESSION['flash']['success'] = 'Un email de confirmation vous a été envoyé pour valider votre compte';
     header('Location: login.php');
    exit();

}

}

?>

<?php require 'inc/header.php'; ?>

<h1> S inscrire </h1>
<?php if(!empty($errors)) : ?>
    <div class="alert alert-danger">
        <p> Vous n'avez pas rempli le formulaire correctement </p>
<ul>

        <?php foreach($errors as $error): ?>
            <li><?= $error; ?></li>

                <?php endforeach; ?>

                    </ul>
                        </div>      
                            <?php endif; ?>

<form action="" method="POST">

<div class="form-group">

<label for="">Nom</label> <br>

<input type="text" name="username" required />

</div>

<div class="form-group">

<label for="">Email</label> <br>

<input type="Email" name="email" class="form-control" required />

</div>

<div class="form-group">

<label for="">Mot de passe</label> <br>

<input type="password" name="password" class="form-control" required />

</div>

<div class="form-group">

<label for="">Confirmez votre mot de passe</label> <br>

<input type="password" name="password_confirm" class="form-control" required />

<br><br><button type="submit" class="btn btn-primary">M'inscrire </button>
</div>

</form>

<?php require 'inc/footer.php' ?>```

Je vous remercie de votre attention porté a mon sujet, mais je regarde la vidéo plusieurs fois et j'ai plusieurs fois chercher ( deux - trois jours sans succées.. )

Bien cordialement, 

2 réponses


Lartak
Réponse acceptée

Bonsoir.
Pour commencer, pour éviter d'avoir des messages flash qui ont déja été affiché, pense à unset la clé flash de la variable $_SESSION après la boucle foreach de récupération des messages flash, soit :

<?php if(isset($_SESSION['flash'])): ?>
    <?php foreach($_SESSION['flash'] as $type => $message): ?>
        <div class="alert alert-<?= $type; ?>">
            <?= $message; ?>
        </div>
    <?php 
        endforeach; 
        unset($_SESSION['flash']); 
endif; ?>

Ils sont affichés dans le fichier header.php si je ne me trompe pas.
Car il est clair que les messages flash ne sont pas nettoyés au fur et à mesure.

déjà je remarque que l'id augmente de 1 je ne sais pas pourquoi ..

Si tu regardes bien, il n'y a pas que l'id qui augmente, que ce soit le mot de passe encrypté ou le token de confirmation, ils sont tous les deux différents dans les deux premiers debug, si tu as un problème c'est plutôt au niveau de ta page de confirmation.
Ce sont en fait deux enregistrements différents étant donné que l'ID que tu vois dans le debug, correspond à l'id d'enregistrement d'un utilisateur en base de données.

Salut je te remercie de ta réponse, alors effectivement j'ai retrouvé l'erreur dans le header.php, du moins une erreur :

<?php if(isset($session['flash'])) : ?>

au lieu de 

<?php if(isset($_SESSION['flash'])) : ?>

Maintenant quand je creer mon compte j'ai :

 Un email de confirmation vous a été envoyé pour valider votre compte

<h1>Votre compte</h1>

Array
(
    [auth] => stdClass Object
        (
            [id] => 19
            [username] => blablabla
            [email] => ..@..
            [password] => $2y$10$a6A9IuNPkb0Z9.ACYd4qO.Srpagei/RzgepkAvJJwTKiiA2NrHIpe
            [confirmation_token] => ygzmIb1qOuVluNO51U2IJa3sgJTLg3h0TD5lC1V1BoyoIoAtMSIo9G99aAwJ
            [confirmed_at] => 
        )

)

j'ai enfin le message qui apparait ( a la bonheur lol )

quand je valide :

Votre compte a bien été validé
Votre compte


Array
(
    [auth] => stdClass Object
        (
            [id] => 20
            [username] => blabla
            [email] => ..@..
            [password] => $2y$10$.4jghgZ4R0xsh17N7jfyDeP1H3xaKhxWMBdJbLU0jD/cGu6lJGzzm
            [confirmation_token] => PGb9eSnmMRs73tfY51Uy7c8pQ7EOs8U6jnrKzPfOnHaEYOBm0pa0jk9Mx1Gg
            [confirmed_at] => 
        )

)

j'ai donc deux enregistrements différents et un seul enregistrement dans la bdd...

quand je reclique sur le lien pour tester ...
j'ai bien ce lien n'est plus valide et

Array
(
    [auth] => stdClass Object
        (
            [id] => 20
            [username] => blabla
            [email] => ...@....
            [password] => $2y$10$.4jghgZ4R0xsh17N7jfyDeP1H3xaKhxWMBdJbLU0jD/cGu6lJGzzm
            [confirmation_token] => PGb9eSnmMRs73tfY51Uy7c8pQ7EOs8U6jnrKzPfOnHaEYOBm0pa0jk9Mx1Gg
            [confirmed_at] => 
        )

)

maintenant je vais chercher dans la page confirmation lol

je te tiens au courant :)

Par contre dans confirm.php tout m'a l'air normal :

<?php 

$user_id = $_GET['id'];

$token = $_GET['token'];

require '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){

    $pdo->prepare('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?')->execute([$user_id]);

        $_SESSION['flash']['success'] = 'Votre compte a bien été validé';
        $_SESSION['auth'] = $user;
            header('Location: account.php');

}else {

    //die('Oupss un petit probleme..') ;
        $_SESSION['flash']['danger']= "Ce lien n'est plus valide";
        header('location: login.php');
}

?>