Passage d'objet en session

Mammouth du PHP | 983 Messages

15 déc. 2005, 10:21

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 ;)

Mammouth du PHP | 1311 Messages

15 déc. 2005, 10:38

un petit bout de code pour avoir une meilleur idée :)
sinon moi je fait mon session_start avant l'autoload

Mammouth du PHP | 983 Messages

15 déc. 2005, 14:19

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>

Mammouth du PHP | 983 Messages

17 déc. 2005, 23:31

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.

Mammouth du PHP | 1311 Messages

18 déc. 2005, 01:10

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

Mammouth du PHP | 983 Messages

18 déc. 2005, 01:20

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.

Toon
Invité n'ayant pas de compte PHPfrance

07 déc. 2006, 14:00

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

Mammouth du PHP | 592 Messages

07 déc. 2006, 14:40

le session_start met le en premier
des fois les includes le font dérailler :P