Bonjour,

Je suis actuellement en train de dev. un petit site pour un ami et j'ai un problème pour gérer la connexion des membres, la structure du site est la même que sur un ancien tuto de grafikart c'est à dire qu'il y a un index.php à la racine du projet qui fait un require du model puis se connecte à la BDD et enfin inclus la page dont le chemin lui a été passé dans $_GET'p'].

J'ai donc modifier ce index.php afin de rajouter un petit bout de code mais qui n'a pas l'air de fonctionner de page en page :

if (isset ($_COOKIE'JetonSession']) && isset ($_COOKIE'Email'])) {
    /* Traitement des données */
}
else {
    echo "DEBUG : Vous n'êtes pas connecté.</br>";
    define("ID_MEMBRE",0);
}

Malheureusement avec cette méthode je ne comprends pas pourquoi la condition se retrouve parfois sur FALSE ce qui nous amène dans le bloc du else, logiquement une fois le cookie créé le isset ($_COOKIE'']) devrait tout le temps renvoyer TRUE jusqu'à expiration de celui-ci non ?

Voici d'autres parties de codes qui pourraient vous aider à m'aider :

index.php complet :

<?php
require('model/model.class.php');
//Si le site est sur le serveur de production mettre cette variable sur 1.
$release = 1;
if(!$release) {
    define('WEBROOT','http://localhost/public/ProjetKoala/');
    $log_mysql_server ='localhost';
    $log_mysql_pseudo ='root';
    $log_mysql_password =' *******';
}
else {
    /* Partie cachée */
}
/ ***************CONNEXION A LA BDD********* /
$connect = @mysql_connect($log_mysql_server,$log_mysql_pseudo,$log_mysql_password);
//$connect =0;
 if($connect) {mysql_select_db('maplaced');}
 //else { echo '<div style="width: 99%;background-color:#ffffff;color:red;margin:auto;font-weight:bold;">La BDD est injoignable, merci de réésayer plus tard.<br/>Si le problème persiste merci de contacter l\'administrateur.</div>';}
/ ************FIN CONNEXION A LA BDD********* /

/ **Vérification de la connection du membre** /
$Connexion = Model::load('membre','Membre');
if (isset ($_COOKIE'JetonSession']) && isset ($_COOKIE'Email'])) {
    $JetonSession = mysql_real_escape_string (htmlspecialchars ($_COOKIE'JetonSession']));
    $Email = mysql_real_escape_string (htmlspecialchars ($_COOKIE'Email']));
    $IdMembre = $Connexion -> EmailVersId ($Email);

    //Si on a trouvé un jeton correspondant avec l'id associé à l'email
    if($IdMembre != 0 && $Connexion -> CorrespondanceSession ($IdMembre, $JetonSession)) {  
        $Connexion -> RepousserExpirationSession ($IdMembre);
        define("ID_MEMBRE",$IdMembre);
        $Donnees = $Connexion -> find(array(
            "conditions" => "Id = '".ID_MEMBRE."'"
        ));
        $Donnees = $Donnees[0];
        define("PSEUDO_MEMBRE",$Donnees'Pseudo']);
        define("EMAIL_MEMBRE",$Donnees'Email']);
        define("BANNI_MEMBRE",$Donnees'Banni']);
    }
    else {
        define("ID_MEMBRE",0);
    }
}
else {
    echo "DEBUG : Vous n'êtes pas connecté.</br>";
    define("ID_MEMBRE",0);
}
//Variable tableau contenant les pages nécessitant absolument d'être connecté sur le site.
$PageConnecte = array ("membre/profil","concours/ajouter");
//Boucle de redirection vers la page d'accueil en cas d'accès à une page membre hors connexion
if((isset($_GET'p']) && ID_MEMBRE == 0) || BANNI_MEMBRE == 1){
    foreach($PageConnecte as $v){
        if($v == $_GET'p'])
            $_GET'p'] = 'update';
    } // foreach ()
} // if()

if(!isset($_GET'p'])){ $_GET'p'] = "index"; } //Page d'accueil
if(!file_exists('content/'.$_GET'p'].'.php')) { $_GET'p'] = '404';}
ob_start();
include 'content/'.$_GET'p'].'.php';
$current_path = $_GET'p'];
$contenu = ob_get_contents();
ob_end_clean();
include 'content/template.php';
mysql_close($connect); 
?>

Et les méthodes correspondants à la gestion des sessions utilisateurs :

public function CreerSession ($IdMembre) {
        $old_table = $this-> table;
        $this -> table = "Membre_session";

        $IdMembre = mysql_real_escape_string (htmlspecialchars ($IdMembre));
        //Récupération de l'email correspondante
        $this -> table = $old_table; 
        $Data = $this -> find ( array(
           "conditions" => "Id = '".$IdMembre."'"
        ));
        $Email = $Data[0]'Email'];
        $this -> table = "Membre_session";

        //Génération d'un jeton
        $JetonSession = sha1(rand());

        //Définition du temps d'expiration de la session
        $TempsExpiration = time() + (60*60) * 24 * 7; // 60 * 60 * 24 * 7 = 1h * 24 * 7 = 1 jour * 7 = 1 semaine

        $DataSession = $this -> find( array(
            "conditions" => "IdMembre = '".$IdMembre."'"
        ));

        //S'il n'y a pas de session on en créer une 
        if (count ($DataSession) == 0) {
            $sql = "INSERT INTO Membre_session(IdMembre, JetonSession, Creation, Expiration)
                    VALUES ('".$IdMembre."','".$JetonSession."','".$this -> ActualDatetime ()."','".$this -> ActualDatetime ($TempsExpiration)."')";
            mysql_query ($sql);
        }
        //Sinon on remplace l'ancienne.
        else {
            $this -> save (array(
                "IdMembre" => $IdMembre,
                "JetonSession" => $JetonSession,
                "Creation" => $this -> ActualDatetime (),
                "Expiration"=> $this -> ActualDatetime ($TempsExpiration)
            ), "IdMembre");
        }

        //Ensuite on créer les cookies correspondant.
        setcookie("JetonSession", $JetonSession, $TempsExpiration);
        setcookie("Email", $Email, $TempsExpiration);

        $this -> table = $old_table; 
    }

    public function CorrespondanceSession ($IdMembre, $Jeton) {
        $old_table = $this-> table;
        $this -> table = "Membre_session";
    $IdMembre = mysql_real_escape_string (htmlspecialchars ($IdMembre));
    $Jeton = mysql_real_escape_string (htmlspecialchars ($Jeton));
    $Data =$this -> find(array (
        "conditions" => "IdMembre = '".$IdMembre."' && JetonSession = '".$Jeton."'"
    ));
        $this -> table = $old_table; 
    if( isset($Data[0])) {
        return true;
    }
    else {
        return false;
    }
    }

    public function RepousserExpirationSession ($IdMembre) {
        $old_table = $this-> table;
        $this -> table = "Membre_session";

     //Définition du temps d'expiration de la session
        $TempsExpiration = time() + (60*60) * 24 * 7; // 60 * 60 * 24 * 7 = 1h * 24 * 7 = 1 jour * 7 = 1 semaine
    $IdMembre = mysql_real_escape_string (htmlspecialchars ($IdMembre));
    //Le nouveau temps d'expiration devient : 
        $this -> save (array(
        "IdMembre" => $IdMembre,
        "Expiration"=> $this -> ActualDatetime ($TempsExpiration)
        ), "IdMembre");
    $this -> table = $old_table;     
    }

Je vous remercie d'avance pour une éventuelle aide de votre part,
Wapaca.

3 réponses


Wapaca
Auteur
Réponse acceptée

Salut,

Merci à toi d'être passé sur le sujet et non ça ne vient pas de là j'ai déjà vérifié et corrigé cette oublie sur la version actuelle du site mais de toute manière l'expiration est fixé à une semaine donc ça ne pourrait venir de là.

D'autres pistes ? ce que je trouve bizarre c'est que les cookies restent sur les pages inscription et profil alors qu'il n'y a pas aucune classe qui pourrait toucher aux cookies instancié dedans mais par contre pour les pages "update" et "pages" ça ne fonctionne pas...

EDIT :

C'est bon problème résolu après avoir vérifié la documentation sur setcookie, en particulier pour le paramètre PATH :

"Le chemin sur le serveur sur lequel le cookie sera disponible. Si la valeur est '/', le cookie sera disponible sur l'ensemble du domaine domain. Si la valeur est '/foo/', le cookie sera uniquement disponible dans le répertoire /foo/ ainsi que tous ses sous-répertoires comme /foo/bar/ dans le domaine domain. La valeur par défaut est le répertoire courant où le cookie a été défini."

J'ai donc modifié

setcookie("Email", $Email, $TempsExpiration, null, null, false, true);

par

setcookie("Email", $Email, $TempsExpiration,'/', substr(substr(WEBROOT,0,-1),7), false, true);
Wapaca
Auteur

Salut,

Oui le prédicat setcookie renvoie bien TRUE donc ça devrait être bon mais après je pense que c'est plutôt au niveau de la sémantique de mon code que ça coince.

Et si je fais un print_r($_COOKIE) dans le index.php je ne vois pas les cookies JetonSession et Email :s

Voici un endroit où j'ai placé le site si vous voulez voir ce qu'il se passe avec le print_r :
http://www.echangesdevotes.fr

Ta fonction RepousserExpirationSession ne met pas à jour la date d'expiration des cookies. Donc la session n'expire pas mais les cookies si.