OVH Cloud OVH Cloud

Petite incomprehension quand aux sessions

5 réponses
Avatar
PIQUET Yann
Bonjour,

J'ai en ce moment une legere incompréhension quand au fonctionnement des
sessions...

Je suis en train de programmer un jeu en PHP5. J'utilise quatre classes:
database (avec un design pattern de singleton, qui sert à la connection
à la base de données, et un __destruct() qui contient juste
mysql_close($this->dbLink) ), user qui me sers à gerer toutes les
informations des utilisateurs, et qui dans son __destruct() met à jour
toutes les informations modifiées, maison qui sert simplement à lister
les pieces d'une maison quelquonque et piece qui gere une piece en
particulier et les actions de l'utilisateur dans cette piece, avec une
fonction __destruct() pour mettre à jour les informations sur la piece.

Jusqu'ici, tout marche. Seulement, là où j'ai le probleme, c'est à ce
niveau: je stoque dans une variable de session le numéro de la maison où
se trouve l'utilisateur à la fin du script, comme ceci:

<?php

session_start();

[...]

$_SESSION['maison'] = $idMaison;
redir('Action effectuée', 'attac.php');
?>

Si je rajoute echo $_SESSION['maison']; avant le ?>, il m'indique
effectivement la valeure de $idMaison. Mais lorsque je change de page
(la fonction redir affiche une avec une balise meta
http-equiv="refresh"), j'ai ce code:

<?php

session_start();
echo $_SESSION['maison'];

?>

et là, le echo me renvoi ceci:

#Object ID 1

Et je ne comprends pas tout à fait pourquoi est-ce que la valeure
change... Sachant que j'ai bien sur verifié et qu'il n'ai fait aucune
allusion à une quelquonque utilisation de $_SESSION dans le __destruct()
de mes classes :s

Aussi, si quelqu'un pouvait m'indiquer de quel coté je dois orienter mes
recherches pour resoudre ce probleme, je lui en serait grandement
reconnaissant.

Merci d'avance,

Aramiil

5 réponses

Avatar
loufoque
PIQUET Yann a dit le 13/09/2005 09:25:

Mais lorsque je change de page
(la fonction redir affiche une avec une balise meta
http-equiv="refresh")


Ta fonction redir ne transmet pas l'id de session.

Avatar
PIQUET Yann
loufoque wrote:
PIQUET Yann a dit le 13/09/2005 09:25:

Mais lorsque je change de page (la fonction redir affiche une avec une
balise meta http-equiv="refresh")



Ta fonction redir ne transmet pas l'id de session.


Et pourtant, les autres variables de la session sont toujours
présentes... Voici la fonction redir:

function redir($texte, $dest)
{
echo '<html><head><title>Redirection en cours...</title><link
rel="stylesheet" type="text/css" href="style.css" /><meta
http-equiv="refresh" content="3; URL=' . $dest . '"></head><body>';
echo '<table style="width: 40%; position: absolute; top: 50%; left:
30%;" cellspacing="0"><tr><td style="background-color: #0000A0;
left-margin: 40px; color: #F0F0FF;">' . $texte . '</td></tr><tr><td
style="background-color: #F0F0FF; text-align: center;">Vous allez
&ecirc;tre redirig&eacute; dans quelques instants.<br />( <a href="' .
$dest . '" title="Cliquez">Cliquez ici si votre navigateur ne vous
redirige pas.</a> )</td></tr></table></body></html>';
die();
}

Par contre, j'ai remarqué quelque chose: si au lieu de stoquer la
variable $idMaison dans $_SESSION['maison'], je la stoque dans
$_SESSION['house'] (par exemple), tout marche.

Donc, est-il possible que ce probleme soit en fait du à un bug dans la
gestion de destruction de classes? Puisqu'il n'y à qu'une instance de la
classe maison, se pourrait-il que le #Object ID 1 soit une reference à
cette classe maison, qui aurait pour une raison mysterieuse été stoquée
dans la variable de session du même nom? Cela est-il lié au fait que
cette classe n'a pas de fonction __destruct() surchargée?

En effet, comme je l'ai dit, le reste de ma session fonctionne toujours:
l'identifiant de l'utilisateur, qui passe lui aussi par une session,
ainsi que la piece dans laquelle il se trouve (variable
$_SESSION['piece'], donc variable du nom d'une classe avec surcharge de
la fonction __destruct()) sont parfaitement passée et ne posent pas de
problemes.

Donc voila, ce n'est pas un probleme plus longtemps puisqu'il est résolu
en changeant le nom de la clé dans le tableau de session, mais j'avoue
que je m'interroge...

Bonne soirée,

Aramiil


Avatar
loufoque
PIQUET Yann a dit le 14/09/2005 à 00:44:

Par contre, j'ai remarqué quelque chose: si au lieu de stoquer la
variable $idMaison dans $_SESSION['maison'], je la stoque dans
$_SESSION['house'] (par exemple), tout marche.


Sûrement un problème lié à register_globals dans ce cas.

Avatar
PIQUET Yann
loufoque wrote:
PIQUET Yann a dit le 14/09/2005 à 00:44:

Par contre, j'ai remarqué quelque chose: si au lieu de stoquer la
variable $idMaison dans $_SESSION['maison'], je la stoque dans
$_SESSION['house'] (par exemple), tout marche.



Sûrement un problème lié à register_globals dans ce cas.


register_globals est à off dans le php.ini, et je n'utilise aucune
methode du type ini_set pour le mettre à on:

;[...]
variables_order = "EGPCS"

;[...]
register_globals = Off

;[...]
register_long_arrays = On


Avatar
Yann PIQUET
PIQUET Yann wrote:
loufoque wrote:

PIQUET Yann a dit le 14/09/2005 à 00:44:

Par contre, j'ai remarqué quelque chose: si au lieu de stoquer la
variable $idMaison dans $_SESSION['maison'], je la stoque dans
$_SESSION['house'] (par exemple), tout marche.




Sûrement un problème lié à register_globals dans ce cas.



register_globals est à off dans le php.ini, et je n'utilise aucune
methode du type ini_set pour le mettre à on:

;[...]
variables_order = "EGPCS"

;[...]
register_globals = Off

;[...]
register_long_arrays = On


Bonjour,

Je me permet de faire remonter ce sujet, j'aimerais vraiment comprendre
la raison de ce comportement assez étrange de PHP... Si quelqu'un à une
idée du pourquoi de ce remplacement de classe...

Merci d'avance

Aramiil