Bonjour à tous,

Voilà plusieurs jours que j'écume le web, j'ai relu mon code en long, en large et en travers, en vain. Je ne comprends pas pourquoi la déconnexion ne fonctionne pas... ou en tout cas, pas longtemps :(. Et j'avoue que je commence à m'énerver un petit peu...
Présentation du code et de l'architecture du site

J'ai un site pour lequel je souhaite qu'aucune page ne soit accessible tant que l'utilisateur n'est pas connecté. Pour cela, j'utilise les sessions. La connexion fonctionne très bien, l'utilisateur peut alors accéder à toutes les pages. Mais la déconnexion... J'ai un bouton "Déconnexion" qui apparaît dans un menu chargé sur chaque page (sauf celle de connexion) du site ; quand on clique dessus, le code suivant est exécuté :

session_start();
$_SESSION = array();
session_unset();
session_destroy();
header("location:http://letronedeferjce.com/");

Le header() renvoie vers la page de connexion du site. Sur cette page, il n'y a pas de session_start() car justement, l'utilisateur n'est pas encore connecté... A la place, en tout début de page, je fais quand même le test suivant, afin de rediriger l'utilisateur vers l'intérieur du site si jamais il est déjà connecté (s'il a tapé l'URL directement alors qu'il était connecté) :

if(!empty($_SESSION'id'])) {
    header("Location: http://www.letronedeferjce.com/php");
    die;
}

C'est la première chose qui ne fonctionne pas :(. Quand je me connecte, si je réinscris ensuite l'URL en enlevant le "/php", je reviens sur la page de connexion.

Sur la page d'index se trouvant dans le répertoire /php, la première chose que je fais est de charger le menu que l'on retrouve sur chaque page. Celui-ci commence par le code suivant :

session_start();
if(empty($_SESSION'id'])) {
    $_SESSION = array();
    session_unset();
    session_destroy();
    header("Location: http://www.letronedeferjce.com/");
    die;
}

Donc en gros, sur le même système que ci-dessus, si l'utilisateur tape cette URL alors qu'il n'est pas connecté, il est envoyé sur la page de connexion. Et cela fonctionne... mais pas toujours :'(.

Enfin, le code exécuté lorsqu'on clique sur le bouton "Connexion" de la page de connexion ressemble à cela :

$pseudo = $_POST'pseudo'];
$mdp = sha1($_POST'password']);
if(empty($pseudo) and empty($password)) {
    $_SESSION = array();
    session_unset();
    session_destroy();
    echo 'Veuillez renseigner tous les champs';
} else {
    //$db contient la connexion à la base de données, il a été initialisé plus haut
    $queryConnect= $db->prepare("SELECT MembreID, Pseudo, Password FROM membre WHERE Pseudo = :pseudo");
    $queryConnect->bindValue(':pseudo',$pseudo);
    $queryConnect->execute();
    $arrayconnect = $queryConnect->fetchAll();
    if($arrayconnect[0]'Password'] == $mdp) {
        session_start();
        $_SESSION'pseudo'] = $arrayconnect[0]'Pseudo'];
        $_SESSION'level'] = $arrayconnect[0]'Rang'];
        $_SESSION'id'] = $arrayconnect[0]'MembreID'];
        header("location: http://www.letronedeferjce.com/php/");
    } else {
        $_SESSION = array();
        session_unset();
        session_destroy();
        echo "Le mot de passe ou le pseudo entré n'est pas correct.";
    }
}

Fonctionnements observés

Au niveau de la déconnexion :

  1. Je me place sur la page de connexion, et je me connecte sans provoquer d'erreur. J'arrive bien sur la page d'index du dossier /php.

  2. Je modifie l'URL en la remplaçant par la page de connexion de mon site : http://www.letronedeferjce.com. J'arrive effectivement sur la page de connexion, alors que j'aurais dû rester (selon moi en tout cas !) sur la page où j'étais.

  3. Je re-modifie l'URL pour retourner sur cette page que je n'aurais pas dû quitter. Je clique sur le bouton "Déconnexion". J'arrive bien sur la page de connexion du site, donc tout va bien.

  4. Je change l'URL par http://www.letronedeferjce.com/php. Le "/php" disparaît et je reste sur la page de connexion (puisque je ne suis pas connecté), et je me dis "Super ! Ca marche !"

  5. Je change à nouveau l'URL par http://www.letronedeferjce.com/php, et là... c'est le drame. Je me retrouve sur la page d'index du dossier /php, comme si j'étais connecté. D'ailleurs, si je teste mes valeurs, mon $_SESSION'id'] vaut à nouveau 5, alors que juste avant, sur la page de connexion, il m'indiquait bien qu'il n'existait plus !

Bref, je n'y comprends plus rien... d'où mon appel à l'aide. Toutes les réponses sont les bienvenues.

Désolé pour le roman. Si vous avez besoin de précisions, n'hésitez pas !

Merci d'avance à tous.

4 réponses


Elgrim
Auteur
Réponse acceptée

merci de l'aide apporté mais le problème venait que le token crée par session_id() était toujours présent malgré le session destroy ma session était toujours existante.

Bonjour,

Pour la page de connexion, tu dois rajouter <u>session_start()</u> car sinon <u>if(!empty($_SESSION'id']))</u> ne pourra jamais trouver la variable <u>$_SESSION'id']</u> du fait que les sessions ne sont pas initialisées.

Tu peux aussi avoir le même problème dans ton fichier : connexion.php

// ....
if(empty($pseudo) and empty($password)) {
    $_SESSION = array(); // <-------------------------------------------- Ici la session n'est pas initialisé
    session_unset();
    session_destroy();
    echo 'Veuillez renseigner tous les champs';
} else {
    // ....
    if($arrayconnect[0]'Password'] == $mdp) {
        session_start(); // <-------------------------------------------- Ici c'est bon
        $_SESSION'pseudo'] = $arrayconnect[0]'Pseudo'];
        $_SESSION'level'] = $arrayconnect[0]'Rang'];
        $_SESSION'id'] = $arrayconnect[0]'MembreID'];
        header("location: http://www.letronedeferjce.com/php/");
    } else {
        $_SESSION = array(); // <---------------------------------------- Ici la session n'est pas initialisé
        session_unset();
        session_destroy();
        echo "Le mot de passe ou le pseudo entré n'est pas correct.";
    }
}

Tu devrais plutôt initialiser la session au début de ton script et pas en plein milieu

Pour appuyer encore ce que dis jo-jo-123: A partir du moment ou tu as besoin de sessions dans ton site, tu ferais mieux de l'initialiser systématiquement (y compris dans ta page qui ne nécessite pas d'etre loggé) pour éviter ce genre de problème.