Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/03/2011, 16h39   #1
Invité de passage
 
Inscription : octobre 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 5
Points : 1
Points : 1
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 :
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 :
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>
funcinema5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 23h56   #2
Membre émérite
 
Avatar de alain31tl
 
Alain
Inscription : novembre 2005
Messages : 897
Détails du profil
Informations personnelles :
Nom : Alain
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : novembre 2005
Messages : 897
Points : 910
Points : 910
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.
alain31tl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 09h41   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Salut

Code :
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]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 22h58   #4
Invité de passage
 
Inscription : octobre 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 5
Points : 1
Points : 1
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 :
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 :
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                                          *
 ***********************************************************************/
}
 
?>
funcinema5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 10h45   #5
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
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
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 17h51   #6
Membre éclairé
 
Avatar de BornBanane
 
Homme
Ingénieur développement logiciels
Inscription : mars 2007
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2007
Messages : 274
Points : 350
Points : 350
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
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/04/2011, 18h12   #7
Invité de passage
 
Inscription : octobre 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 5
Points : 1
Points : 1
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.
funcinema5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 20h19   #8
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Citation:
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 :
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 :
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]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 21h04   #9
Membre Expert
 
Inscription : septembre 2010
Messages : 1 240
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 240
Points : 1 562
Points : 1 562
Pour ouvrir une session tu peux faire :

Code :
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.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 23h35   #10
Invité de passage
 
Inscription : octobre 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 5
Points : 1
Points : 1
Ok, merci pour les réponses, je vais mettre tout ce joli code à jour.
funcinema5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 11h45   #11
Membre éclairé
 
Avatar de BornBanane
 
Homme
Ingénieur développement logiciels
Inscription : mars 2007
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2007
Messages : 274
Points : 350
Points : 350
Perso cette astuce que je donne je l'avais lu sur la documentation de ZF.
Citation:
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
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 14h10   #12
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
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 Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 16h54   #13
Membre Expert
 
Inscription : septembre 2010
Messages : 1 240
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 240
Points : 1 562
Points : 1 562
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 :
if (!session_id()) session_start();

est une solution souvent bien pratique.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h48.


 
 
 
 
Partenaires

Hébergement Web