OVH Cloud OVH Cloud

Session + Objet

3 réponses
Avatar
Toto Le Ouf
Bonsoir,
Je souhaite stocker un objet dans une session. Comment faut-il procéder ?
J'ai tenté ceci :

//création de l'objet
$liste = new Liste_image($db,$rep);

//stockage en session
if(!session_is_registered("liste_image")) {
session_register("liste_image");
$_SESSION["liste_image] = $liste;
}

J'ai aussi tenté avec un serialize :

//création de l'objet
$liste = new Liste_image($db,$rep);

//stockage en session
if(!session_is_registered("liste_image")) {
session_register("liste_image");
$_SESSION["liste_image] = serialize($liste);
}

Dans les 2 cas, lorsque je fais die(var_dump($_SESSION)), j'obtiens quelque
chose comme ceci :

array(2) { ["liste_image"]=> array(1) { [0]=>
object(__PHP_Incomplete_Class)#2 (6) { ["__PHP_Incomplete_Class_Name"]=>
string(11) "Liste_image" ["db"]=> object(Db)#3 (2) { ["db_id"]=> int(-1)
["erreur"]=> string(0) "" } ["t_image"]=> array(3) { [1]=>
object(__PHP_Incomplete_Class)#4 (6) { ..........


Une idée ?
J'aurais également savoir si c'était possible de stocker un objet en session
à partir d'une de ses fonctions membres ?

Merci.
T.

3 réponses

Avatar
Atruskor
Bonjour,

il y a déjà la réponse dans ta question en fait ! En effet il faut
utiliser la fonction serialize pour "mettre à plat" ton objet
(utilisé pour le sauvegarder, le "transporter"...).

Pour récupérer un objet instancié il faut utiliser la fonction
unserialize():

$maListe = unserialize($_SESSION["liste_image"];

Voilà, à noter qu'idéalement il faudrait ne pas utiliser
session_register($myvar) (mais quelle version de php utilises tu ! :)
), qu'il ne faut pas utiliser une variable en entrée sans avoir
controlé son contenu et que pour que le unserialize fonctionne la
classe (ou le fichier qui la contient) doit être inclue dans le script
qui désérialise l'objet.

J'espere que ma réponse t'a aidé.
Bonne journée,

Jean-Baptiste FELDIS.
Avatar
xav
Bonsoir,
Je souhaite stocker un objet dans une session. Comment faut-il procéder ?
J'ai tenté ceci :

Dans les 2 cas, lorsque je fais die(var_dump($_SESSION)), j'obtiens quelque

chose comme ceci :

array(2) { ["liste_image"]=> array(1) { [0]=>
object(__PHP_Incomplete_Class)#2 (6) { ["__PHP_Incomplete_Class_Name"]=>
string(11) "Liste_image" ["db"]=> object(Db)#3 (2) { ["db_id"]=> int(-1)
["erreur"]=> string(0) "" } ["t_image"]=> array(3) { [1]=>
object(__PHP_Incomplete_Class)#4 (6) { ..........


Une idée ?
J'aurais également savoir si c'était possible de stocker un objet en session
à partir d'une de ses fonctions membres ?



Salut,
ce comportement est normal, afin de pouvoir recuperer l'objet intact, il
te faut inclure la classe le definissant avant le session_start();

c'est ecrit ici dans le manuel:
http://fr.php.net/manual/fr/language.oop.serialization.php


<?php
require_once 'Liste_Image.inc.php';
session_start();

?>
et ensuite tout devrait rouler.

Pour la seconde question, si je l'ai bien comprise: un truc de ce genre
? c'est bien ca ?

$obj = new Machin();
$obj->doSomething();
$obj->saveSelfInSession();

avec un truc genre:
function saveSelfInSession()
{
$_SESSION['obj'] =& $this;
}


Oui, ca ne pose pas de problemes a mon sens.

A ++
xav


Avatar
Toto Le Ouf
"Atruskor" a écrit dans le message de
news:
Bonjour,

il y a déjà la réponse dans ta question en fait ! En effet il faut
utiliser la fonction serialize pour "mettre à plat" ton objet
(utilisé pour le sauvegarder, le "transporter"...).

Pour récupérer un objet instancié il faut utiliser la fonction
unserialize():

$maListe = unserialize($_SESSION["liste_image"];

Voilà, à noter qu'idéalement il faudrait ne pas utiliser
session_register($myvar) (mais quelle version de php utilises tu ! :)
), qu'il ne faut pas utiliser une variable en entrée sans avoir
controlé son contenu et que pour que le unserialize fonctionne la
classe (ou le fichier qui la contient) doit être inclue dans le script
qui désérialise l'objet.

J'espere que ma réponse t'a aidé.
Bonne journée,

Jean-Baptiste FELDIS.


Effectivement, ça marche, je n'ai rien eu à changer... La fatigue surement
:-)
Merci encore.
T.