Page 1 sur 1

Passage d'objet en session

Posté : 15 déc. 2005, 10:21
par rami
Bonjour,

J'ai un petit problème pour passer des objets SimpleXML en session. J'utilise la fonction __autoload() pour charger automatiquement mes classes. Le soucis est que je récupère bien mon objet (en plaçant l'include de la fonction __autoload() avant session_start()) ainsi que tous ses attributs, mais la fonction session_start() me renvoie des:

Warning: session_start() [function.session-start]: Node no longer exists in

J'ai beau chercher, je ne vois pas d'ou ca vient.

Si quelqu'un a une idée, je suis preneur ;)

Posté : 15 déc. 2005, 10:38
par jeff
un petit bout de code pour avoir une meilleur idée :)
sinon moi je fait mon session_start avant l'autoload

Posté : 15 déc. 2005, 14:19
par rami
Si je mets session_start() avant l'include de la fonction __autoload(), ma désérialisation se passe mal car il ne connaît pas la définition de la classe (il retrouve les attributs mais perds le nom de la classe et le remplace par __PHP_Incomplete_Class).

En mettant l'include de __autoload() avant, ma sérialisation se passe bien sauf que session_start() envoit des Warning: Node no longer exists in mon script.

Exemple de code:
<?php
include 'classloader.php';
session_start();

$q = new QuestionLogin('essai','jhlkj');
$q->send('rep.xml');

if(!isset($_SESSION['question']))
	$_SESSION['question'] = $q;
echo '<pre>';
var_dump($_SESSION['question']);
echo '</pre>';
?>
<br><br>
<a href="test.php"> Test</a>

Posté : 17 déc. 2005, 23:31
par rami
J'avance dans la recherche du problème. Il semble que cela vienne de l'objet simpleXml. Par exemple:

test.class.php
<?php
class Test
{
	public $foo = null;

	public function __construct()
	{
		$this->foo = simplexml_load_string('<root><valeur name="machin"/></root>');
	}
public function __sleep()
	{
		$this->foo = $this->foo->asXML();
	}


	public function __wakeup()
	{
		$this->foo = simplexml_load_string($this->foo);
	}
}
?>
test.php
<?php
include 'test.class.php';
session_start();

if(isset($_GET["off"]))
	session_destroy();

$t = new Test();

if(!isset($_SESSION['foo']))
{
	$_SESSION['foo'] = $t;
	echo 'on définit la session<br>';
}
echo '<pre>';
print(htmlentities($_SESSION['foo']->foo->asXML()));

echo 'Classe: '.get_class($_SESSION['foo']->foo);
?>

<a href="test.php5">Test</a><br>

<a href="test.php5?off=1"> Détruire la session</a>
Au deuxième affichage de la page apparaissent les messages d'erreur suivants:

Warning: session_start() [function.session-start]: Node no longer exists in d:\mes documents\mes sites\Site Ecv\test.php5 on line 3

Warning: session_start() [function.session-start]: Node no longer exists in d:\mes documents\mes sites\Site Ecv\test.php5 on line 3

Quelqu'un a-t-il dèjà été confronté à ce problème, car là je sèche... #-o

edit: Il semble qu'il y ait des problèmes pour sérialiser des objets SimpleXML. Résolu en utilisant les méthodes __sleep et __wakeup.

Posté : 18 déc. 2005, 01:10
par jeff
je confirme
j'ai essayer ce code
session_start();
if(!isset($_SESSION['try']))
$_SESSION['try']=simplexml_load_file('base.xml');

echo var_dump($_SESSION['try']);
j'ai les meme message
peut etre que simplexml utilise des reference circulaire mais je ne rien trouver avec get_ressource_type :(

peut etre un bogue de simplexml

Posté : 18 déc. 2005, 01:20
par rami
A priori pas un bug. J'ai regardé dans les listes de bus sur bugs.php.net et il semble que le comportement normal de php n'autorise pas la sérialisation d'objet simpleXML.

Posté : 07 déc. 2006, 14:00
par Toon
j'ai trouvé ça:

http://www.developpez.net/forums/showth ... ger+exists

et là un gars dit:

Code : Tout sélectionner

$this->tabChem[$i]=(string)$chem; .. $s=base64_encode(serialize($N)); $_SESSION['courant']=$s; $uns=unserialize(base64_decode($_SESSION['courant']));
cio

Posté : 07 déc. 2006, 14:40
par fred9999
le session_start met le en premier
des fois les includes le font dérailler :P