IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Identifiant de session PHP change à chaque actualisation de page


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Identifiant de session PHP change à chaque actualisation de page
    Bonjour à tous,

    J'utilise le système de session PHP pour gérer un espace admin. Pour cela, j'ai créé une classe en php toute simple qui me permet d'appeler mes fonctions en orienté objet. En gros donc, j'ai mon fichier classSession.inc (que je fais appel dès le début de la page test) puis j'initialise ma session par $Session = new mvSession(); (dans la fichier classSession, la fonction mvSession comporte la ligne suivante : @session_start(); )

    Pour le reste, c'est pareil comme attribuer une variable à la session ouverte, je fais de ce style : $Session->SetValue('champ', 'valeur'); où SetValue équivaut en php à $_SESSION['champ'] = 'valeur';.

    Bref, en gros voilà. Ce système marchait très bien sur un autre hébergement et là, je le teste sur un nouveau site et BIP, ça ne marche. Le plus byzarre, c'est que ça me le fait aussi sur trois autres sites (sur 5). J'ai alors vérifié ce qu'il clochait et j'ai compris alors que la session ne me retournait pas la valeur de la variable alors que j'en ai attribué une (par ma fonction SetValue - voir plus haut). J'ignorais pourquoi ? J'ai fait des test et alors, j'ai remarqué qu'à chaque actualisation de la page, ma session me retournait un nouveau id de session que je récupère avec session_id. Cela prouve qu'il m'en créé une nouvelle à chaque fois. Est-ce ça ? Et pourquoi ? That is the question !

    Merci de votre aide. Bien sûr, ce souci ne vient que si je fais appel à la classe "classSession.inc" que j'ai créé avec mes petites fonctions en orienté objet, en revanche, si je fais appel aux fonction de php pour la gestion des sessions directement sur mon fichier test, bingo, ça marche...

    Le fichier test se trouve à cette adresse : http://www.jeuxaxiii.fr/test/testsession.php
    Merci à tous pour votre aide.

    Amicalement.

    Greg005.

    Voici le bout de code tout simple

    La classe classSession.inc

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    <?php
     
    /***********************************************************************
     * Classe de gestion de session                                        *
     ***********************************************************************/
     
    class mvSession
    {
     
     
    /***********************************************************************
     * Constructeur de la classe mvSession                                 *
     *---------------------------------------------------------------------*
     * $Appli  : Nom de l'application                                      *
     * $SessID : Numéro de la session                                      *
     * $Contol : Clé de contrôle                                           *
     ***********************************************************************/
     
    function mvSession()
    {
    @session_start();
    }
     
    /***********************************************************************
     * Affecte une variable de session                                     *
     *---------------------------------------------------------------------*
     * $Var   : Nom de la variable                                         *
     * $Value : Valeur de la variable                                      *
     ***********************************************************************/
     
    function SetValue($Var, $Value)
    {
    $_SESSION[$Var] = $Value;
    }
     
    /***********************************************************************
     * Retourne le contenu d'une variable de session                       *
     *---------------------------------------------------------------------*
     * $Var   : Nom de la variable                                         *
     ***********************************************************************/
     
    function GetValue($Var)
    {
    if (isset($_SESSION[$Var]))
      $Value = $_SESSION[$Var];
      else
        $Value = NULL;
    return $Value;
    }
     
    /***********************************************************************
     * Retourne le contenu d'une variable de session                       *
     *---------------------------------------------------------------------*
     *                                                                     *
     ***********************************************************************/
     
    function GetId()
    {
    $Value = session_id();
    return $Value;
    }
     
     
    /***********************************************************************
     * Arrêter la session                                                  *
     ***********************************************************************/
     
    function Stop()
    {
    $_SESSION = array();
    session_destroy();
    }
     
    /***********************************************************************
     * Fin de la classe mvSession                                          *
     ***********************************************************************/
    }
     
    ?>

    et la page testsession.php

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    include('class/ClassSession.inc');
    $Session = new mvSession();
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta name="Robots" content="none">
        <meta name="Author" content="Unknow">
        <meta name="Copyright" content="mvSoft">
        <meta name="Generator" content="FrontNet2008 (Win32)">
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
        <meta http-equiv="Content-Language" content="fr">
      </head>
      <body>
        <?php
        if (isset($_GET['test'])) $test = $_GET['test']; else $test = 0;
        
          echo "<a href='testsession.php?test=1'>Appuyer sur le bouton</a>";
          
          if ($test == 1)
            {
            $id = session_id();
            echo $id;
            }
        ?>
      </body>
    </html>

  2. #2
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Salut

    Testé tes codes et ils sont fonctionnels.
    Le fait de réactualiser 100 fois, n'écrase pas l'id de session de base par un autre. ( ?)

    Pas d'anomalie en vue, en tout cas dans les codes présentés.
    Es-tu certain qu'il n'y a pas d'autres fichiers ?

    [Edit] Ou bien celà provient de ton nouvel hébergement, car pas de soucis côté sources.
    Ce n'est pas parce que les choses sont difficiles qu'on n'ose pas les entreprendre.
    C'est parce qu'on n'ose pas les entreprendre qu'elles sont difficiles.

  3. #3
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class mvSession
    {
        function mvSession()
        {
            @session_start();
        }
    }
    Depuis Php5 (soit depuis pas mal d'années maintenant), la syntaxe pour créer un constructeur c'est :
    __construct() { ... }
    Tout comme pour le destructeur : __destruct() { ... }
    Ca fait partie des méthodes dites magiques.
    La doc Php : http://fr2.php.net/manual/fr/language.oop5.magic.php

    Ceci dit, il est autorisé d'utiliser le même nom de la classe, comme cela se fait dans d'autres langages, mais sans dire de bêtise, depuis la version de Php5.3, ça doit être __construct().

    Vérifie la version de Php sur ton nouvel hébergeur, mais le plus simple c'est
    de mettre à jour ton code, car là, c'est plus du Php4 qui est de nos jour est dépassé



    Ceci fait que ça se peut que la méthode mvSession() (le constructeur) ne serait pas appelé, et par conséquent la session ne serait pas démarrée.
    D'ailleurs, en suivant ton lien, je n'obtiens pas de cookie, qui à mon avis confirmerait ça.

    Petit parenthèse au passage, les @ devant les fonctions ou autre ce n'est pas une bonne approche.
    Masquer les erreurs est tout sauf à faire, c'est un peu comme débrancher les organes de sécurités ou d'alertes sur des machines/outils/matériels.
    Bref, ne pas être au courant des erreurs est une erreur.
    Agit par exemple sur la directive display_error du php.ini.
    En résumant :
    En production on l'a met à Off -> aucun affichage des erreurs, mais il seront quand même dispo dans un fichier log.
    En développement à On -> On affiche les erreurs afin de s'aider à corriger les bogues.



    Ils font comment les gens qui ne sont pas sur Windows, comme les Linux, Mac, etc ... ?
    Utilise un jeu de caractère (encodage) bien plus standard qui touchera un maximum de personne, comme l'ISO-8859-15, UTF-8, etc ...
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonsoir à tous,

    Merci pour votre aide et pardons de vous répondre que maintenant. Je viens de modifier le nom de mon constructeur (ça c'est fait) mais le beug persiste...

    Je vais mettre à jour le code. La version de PHP est : 5.2.16

    En enlevant le @ à la fonction session_start(), un problème s'est affiché, une idée : voici le lien http://www.jeuxaxiii.fr/test/testsession.php

    Une autre idée ?

    Pour ce qui est du jeu de caractère "windows-1252", c'est juste une page test, je travaille normalement avec "l'ISO-8859-15".

    Voici tous le code (et c'est bien tout le code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    include('class/ClassSession.inc');
    $Session = new mvSession();
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta name="Robots" content="none">
        <meta name="Author" content="Unknow">
        <meta name="Copyright" content="mvSoft">
        <meta name="Generator" content="FrontNet2008 (Win32)">
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
        <meta http-equiv="Content-Language" content="fr">
      </head>
      <body>
        <?php
        if (isset($_GET['test'])) $test = $_GET['test']; else $test = 0;
     
          echo "<a href='testsession.php?test=1'>Appuyer sur le bouton</a>";
     
          if ($test == 1)
            {
            $id = session_id();
            echo $id;
            }
        echo phpinfo();
        ?>
      </body>
    </html>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    <?php
     
    /***********************************************************************
     * Classe de gestion de session                                        *
     ***********************************************************************/
     
    class mvSession
    {
    var $Limite;
    var $Id;
     
    /***********************************************************************
     * Constructeur de la classe mvSession                                 *
     *---------------------------------------------------------------------*
     * $Appli  : Nom de l'application                                      *
     * $SessID : Numéro de la session                                      *
     * $Contol : Clé de contrôle                                           *
     ***********************************************************************/
     
    public function __construct()
    {
    session_start();
    }
     
    /***********************************************************************
     * Affecte une variable de session                                     *
     *---------------------------------------------------------------------*
     * $Var   : Nom de la variable                                         *
     * $Value : Valeur de la variable                                      *
     ***********************************************************************/
     
    public function SetValue($Var, $Value)
    {
    $_SESSION[$Var] = $Value;
    }
     
    /***********************************************************************
     * Retourne le contenu d'une variable de session                       *
     *---------------------------------------------------------------------*
     * $Var   : Nom de la variable                                         *
     ***********************************************************************/
     
    public function GetValue($Var)
    {
    if (isset($_SESSION[$Var]))
      $Value = $_SESSION[$Var];
      else
        $Value = NULL;
    return $Value;
    }
     
    /***********************************************************************
     * Arrêter la session                                                  *
     ***********************************************************************/
     
    public function Stop()
    {
    $_SESSION = array();
    session_destroy();
    }
     
    /***********************************************************************
     * Fin de la classe mvSession                                          *
     ***********************************************************************/
    }
     
    ?>

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    Citation Envoyé par funcinema5 Voir le message
    En enlevant le @ à la fonction session_start(), un problème s'est affiché, une idée : voici le lien http://www.jeuxaxiii.fr/test/testsession.php
    regarde ça, il y a les explications pour corriger l'erreur et à mon avis ça résoudra ton problème d'identifiant :
    http://php.developpez.com/faq/langag...s_already_sent

  6. #6
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    L'erreur se fait à la ligne 69 de ta classe.
    Mais dans le code que tu nous as donné il n'y a pas de ligne 69, donc c'est possible que cela soit un espace (ou un autre caractère "invisible") qui traine après le tag fermant de PHP.
    Essaie d'enlever le tag fermant dans la classe. Ca évite ce genre de soucis.

    Et je confirme les @ c'est le mal devant les fonctions .
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    MIRACLE !!!! En enlevant la balise , cela fonctionne !!!!

    Merci à vous tous et surtout à BornBanane pour m'avoir aidé à trouver la réponse à mon problème.

    Mais, je ne comprends pas comment cela peut marcher car normalement, j'ai ouvert en haut la balise PHP par mais je ne l'ai pas fermé (puisque je l'ai supprimée) dans la classe. Hors toute balise ouverte doit être fermée, non ?

    Une idée ?

    Merci encore.

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Hors toute balise ouverte doit être fermée, non ?
    Je l'ai découvert il n'y a pas si longtemps que ça cette astuce, et depuis je l'ai exploité absolument partout.

    Php permet d'éviter de fermer la balise ?> pour tous fichiers Php (comme les classes, fonctions).


    Cependant, et comme en général un miracle s'explique difficilement, je te conseillerais que sur ce coup là, et bien sûr provisoirement, de remettre le code comme il était auparavant, donc avec la fermeture ?>, et de tenter de trouver où ce situais ce caractère indésirable.
    Histoire de bien comprendre pourquoi, et qui sait, d'éviter que ce soit l'arbre qui cache la forêt.
    Enfin, c'est un conseil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var $Limite;
    var $Id;
    Ca aussi c'est obsolète, du code Php4.
    Depuis Php5 ça évolué, ce n'est plus var $une_propriete où les propriétés étaient toutes publiques, on a le choix de plusieurs déclarations/portées/visibilités différentes désormais :
    public, protected et private
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    classe UneClasse {
        public $propriete_public;
        protected $propriete_protected;
        private $_propriete_private;
     
        ... etc ...
    }
    On ne sait pas quel est ton support, mais à mon sens il n'est plus à jour.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Pour ouvrir une session tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!session_id()) session_start();

    Ainsi, même si tu insère préalablement du code qui a ouvert une session, tu n'aura pas d'erreur.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ok, merci pour les réponses, je vais mettre tout ce joli code à jour.

  11. #11
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Perso cette astuce que je donne je l'avais lu sur la documentation de ZF.
    Pour les fichiers contenant uniquement du code PHP, la balise de fermeture ("?>") n'est jamais permise. Il n'est pas requis par PHP. Ne pas l'inclure permet de se prémunir les problèmes liés à l'injection accidentelle d'espaces blancs dans la sortie.
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  12. #12
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    personnellement je ne pense pas que session_start() soit bien placée dans un constructeur de classe.

    C'est typiquement le genre d'objet que je sérialise (que je stocke dans $_SESSION quoi ) du coup, session_start() dans une méthode membre et static pour un appel explicite et le constructeur ne sera jamais appelé qu'une fois par visiteur (ou navigateur). ça demande de bien gérer le réveil de l'objet mais je trouve ça plus propre, en tout cas ça va vraiment bien avec le mécanisme d’auto-chargement des classes.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par gene69 Voir le message
    personnellement je ne pense pas que session_start() soit bien placée dans un constructeur de classe.
    Effectivement si tu maitrise l'ensemble de ton code de A à Z...

    Mais par exemple une classe téléchargée sur le net peut avoir besoin pour fonctionner d'activer les sessions. Et pour qu'elle soit autonome il peut être utile d'avoir à le faire (quand on veut qu'elle soit utilisable directement par des "débutants"). C'est pour cette raison que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!session_id()) session_start();

    est une solution souvent bien pratique.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/03/2013, 09h13
  2. Réponses: 10
    Dernier message: 02/02/2011, 21h13
  3. Variable de session, ou define à chaque chargement de page ?
    Par ChriGoLioNaDor dans le forum Langage
    Réponses: 3
    Dernier message: 06/01/2010, 18h09
  4. Réponses: 4
    Dernier message: 29/06/2006, 15h43
  5. [Cookies] L'ID de session change à chaque fois ! :-(
    Par seb92500 dans le forum Langage
    Réponses: 3
    Dernier message: 20/04/2006, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo