Bonjour,

Je rencontre un petit problème avec mon code.

Ce que je fais

J'essaie de mettre en place un système de vérification de connexion, avec changement du boutton de connexion si l'utilisateur est connecté et redirection du BO s'il n'est pas connecté. J'initie la variable de vérification dans la fonction de connection, sauf qu'il semble qu'il perde la valeur true une fois connecté et dans le BO et pourtant le boutton de connexion est bien sur deconnexion. Et quand je navigue sur d'autres pages les variables $_SESSION sont conservées sauf celle-ci.

La fonction de connexion

function logmein(array $user): array{
    if (session_status()===PHP_SESSION_NONE):
        session_start();
    endif;
    require 'pdo.php';
    $u_log = $user[0];
    $u_pass = $user[1];

    $req = $bdd->prepare("SELECT log_in, u_password, id_role, last_login  FROM users WHERE log_in = :log_in AND u_password = :u_password");
    $req->execute(array(
        'log_in' => $u_log,
        'u_password' => $u_pass,
    ));
    $finduser= $req->fetch();

    if(!empty ($finduser)){
        $_SESSION['user_role']=$finduser[2];
        $_SESSION['user_last_log']=$finduser[3];
        $_SESSION['user_connected']=true;
        date_default_timezone_set('Europe/Paris');
        $date = date("Y-m-d H:i:s");
        $req_update = $bdd->prepare('UPDATE users SET last_login = :last_login WHERE log_in = "'.$u_log.'"');
        $req_update->bindParam(':last_login', $date, PDO::PARAM_STR);
        $req_update->execute();
        return [true, $finduser[2], $finduser[3]];
    }else{
        return [false, $finduser[2], $finduser[3]];
    };
    $finduser->closeCursor();
};

Le code du bouton connexion (placer dans un fichier header)

<?php 
if (session_status()===PHP_SESSION_NONE):
    session_start();
endif;?>
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mon blog</title>
    <link rel="stylesheet" href="/css/header.css">
    <link rel="stylesheet" href="/css/mains.css">
</head>
<body>
    <div class="header">
        <img src="/img/banner2.jpg" alt="">
    </div>
    <div class="navbar">
        <div class="home">
            <a href="index.php">Accueil</a>
        </div>
        <div class="learning">
            <a href="#">TP</a>
            <div class="sub-menu">
                <div>
                    <a href="#">HTML/CSS</a>
                </div>
                <div>
                    <a href="#">PHP</a>
                </div>
                <div>
                    <a href="#">JS</a>
                </div>
            </div>
        </div>
        <div class="resume">
            <a href="#">Parcours</a>
        </div>
        <div class="connection">
            <?php  if($_SESSION['user_connected'] === true):?>
                <a href="index.php"><?php $_SESSION['user_connected']=false?>Déconnexion</a>
            <?php else: ?>
                <a href="userConnection.php">Connexion</a>
            <?php endif ?>
        </div>
    </div>
</body>
</html>

Ce que j'obtiens en print_r de $_session

Array ( [user_role] => 1 [user_last_log] => 2021-03-05 21:32:45 [user_connected] => )

3 réponses


Curvata
Réponse acceptée

Pourquoi tu passes ta $_SESSION['user_connected']=false;directement après ton if($_SESSION['user_connected'] === true) ?
Du coup, dés que ton membre est connecté ta variable vaut "false" en fin de "index.php". Donc, je me demande si tu ne fais pas un traitement sur ta session dans un autre fichier dans le cas ou $_SESSION['user_connected']=false; ?

Bonjour,

Alors effectivement ça vient de là. Ce que je souhaite faire c'est sur le lien de deconnexion, la valeur de $_SESSION['user_connected'] passe à false quand l'utilisateur appuye dessus. Je pense que je dois mal m'y prendre.

Edit:
C'est bon je suis passé par un fichier PHP intermédiaire pour passer la valeur à FALSE. Je te remercie.
Et pour ceux qui souhaite savoir le code que j'ai mis.


<?php
if (session_status() === PHP_SESSION_NONE):
    session_start();
endif;

if($_SESSION['user_connected'] === true):
    $_SESSION['user_connected'] = false;
    header('Location: index.php');
    exit();
else:
    header('Location: index.php');
    exit();
endif;

Normalement si ton utilisateur clique sur déconnecter tu dois faire ton traitement dans le controller. Effectivement si tu n'as pas de controller, un fichier intermédiaire fera l'affaire.