Re: [PHP] PHP5, $_SESSION, DOM XML objects not returning value

2005-10-01 Thread Jochem Maas

Daevid Vincent wrote:

Are you f'ing kidding me?!

http://www.php.net/manual/en/ref.session.php

Some types of data can not be serialized thus stored in sessions. It
includes resource variables or objects with circular references (i.e.
objects which passes a reference to itself to another object). 

L A M E !!!

This is absurd. There shouldn't be any reason I can't send a reference to


maybe it's more absurd to try a stick DOM XML objects into the
session in the first place?


another object -- Especially a built in type! UGH.


really why is that?

by all means write a patch that allows the serialization code
to serialize circular references. Though I imagine that it's
a little more difficult than it sounds.

then again you have __sleep() and __wakeup() magic methods which you
maybe able to use to 'shutdown' any references and 'bring them up' again.

btw I believe that the serialization code doesn't care whether objects
are 'built in' or not. it's purely a reference issue.





-Original Message-
From: Daevid Vincent [mailto:[EMAIL PROTECTED] 
Sent: Friday, September 30, 2005 3:02 PM

To: php-general@lists.php.net
Subject: [PHP] PHP5, $_SESSION, DOM XML objects not returning value

I'm trying to store an array of DOM XML objects
(http://www.php.net/manual/en/ref.dom.php) in a PHP5.0.3 
$_SESSION array,
but when I load the session back (and yes, I've declared my 
class before the

session_start()), I get these errors:

Warning: XMLRule::getValue() [function.getValue]: Invalid State Error 
in /lockdown/includes/classes/rule_xml.class.php on line 74


Or

Warning: XMLRule::getValue() [function.getValue]: Invalid State Error 
in /lockdown/includes/classes/rule_xml.class.php on line 81


And all the VALUES are empty, however *my* XMLRule class 
array seems right
otherwise. It's like PHP didn't serialize all of it's own DOM 
XML objects

(which are built in objects!!!)

Here are the pertinent parts of the classes and other code snippets.

##
##
#
class XMLRule 
{
	// for example 'is_username' XML tag would set $name = 
'Username'

   protected $name = null;

// The reference pointer to the DOMNode, this is a wealth of
information in itself.
// look at the DOMNode class @
http://www.php.net/manual/en/ref.dom.php
   protected $DOMNode = null;

   protected function __construct($DOMNode, $name, $id = null) 
	{

$this-DOMNode = $DOMNode;
$this-name = $name;
$this-id = $id;
   } //__construct()


	function getValue() 
	{
		//check for multiple values, such as a list of 
names perhaps

[#74]   if ($this-DOMNode-childNodes-length  1)
{
			foreach ($this-DOMNode-childNodes as 
$tmpNode) 
$tmpArray[] = $tmpNode-nodeValue;

return $tmpArray;
}
else
[#81]   return $this-DOMNode-nodeValue;
}
}

class is_username extends XMLRule
{
function __construct($DOMNode, $id = null) {
parent::__construct($DOMNode, 'Username', $id); }
}

class is_day extends XMLRule
{
function __construct($DOMNode, $id = null) {
parent::__construct($DOMNode, 'Day', $id); }
}

...etc...

##
##
#

// IMPORTANT: You *MUST* declare the class *BEFORE* you call
session_start(). 
// If you run session_start() before the definition of the class, 
// the session variables of the objects will be corrupted.

// http://www.zend.com/phorum/read.php?num=3id=36854thread=36847

require_once('classes/rule_xml.class.php');

if (!isset($_SESSION['ruleArray']))
{
$XMLDOC = new DOMDocument();
$XMLDOC-loadXML($xmlstring);

$ruleArray = array();
$i = 1;
$or = 1;
foreach($XMLDOC-firstChild-childNodes as $myNode)
{
if ($myNode-nodeName == 'and_conditions')
{
foreach($myNode-childNodes as $cNode)
{
$key = (string)($cNode-nodeName);
//make a new instance of the node name'd
class
$ruleArray[$or][$i] = new 
$key($cNode, $i); 
$i++;

}

$or++; //begin new OR block
} //if and_conditions
} //foreach $myNode

$_SESSION['ruleArray'] = serialize($ruleArray);
}
else $ruleArray = unserialize($_SESSION['ruleArray']);

I've tried this with the un/serialize and without. PHP5 is supposed to
handle that for me, but just in case, I tried it anyways.

If I don't use the $SESSION, then things work fine and I have 
my values.


I also tried to do this:

$_SESSION['ruleArray'] = $ruleArray;
$ruleArray = $_SESSION['ruleArray'];

And surprisingly that works (although it doesn't solve my problem).


RE: [PHP] PHP5, $_SESSION, DOM XML objects not returning value

2005-09-30 Thread Daevid Vincent
Are you f'ing kidding me?!

http://www.php.net/manual/en/ref.session.php

Some types of data can not be serialized thus stored in sessions. It
includes resource variables or objects with circular references (i.e.
objects which passes a reference to itself to another object). 

L A M E !!!

This is absurd. There shouldn't be any reason I can't send a reference to
another object -- Especially a built in type! UGH.

 -Original Message-
 From: Daevid Vincent [mailto:[EMAIL PROTECTED] 
 Sent: Friday, September 30, 2005 3:02 PM
 To: php-general@lists.php.net
 Subject: [PHP] PHP5, $_SESSION, DOM XML objects not returning value
 
 I'm trying to store an array of DOM XML objects
 (http://www.php.net/manual/en/ref.dom.php) in a PHP5.0.3 
 $_SESSION array,
 but when I load the session back (and yes, I've declared my 
 class before the
 session_start()), I get these errors:
 
 Warning: XMLRule::getValue() [function.getValue]: Invalid State Error 
 in /lockdown/includes/classes/rule_xml.class.php on line 74
 
 Or
 
 Warning: XMLRule::getValue() [function.getValue]: Invalid State Error 
 in /lockdown/includes/classes/rule_xml.class.php on line 81
 
 And all the VALUES are empty, however *my* XMLRule class 
 array seems right
 otherwise. It's like PHP didn't serialize all of it's own DOM 
 XML objects
 (which are built in objects!!!)
 
 Here are the pertinent parts of the classes and other code snippets.
 
 ##
 ##
 #
 class XMLRule 
 {
   // for example 'is_username' XML tag would set $name = 
 'Username'
 protected $name = null;
 
   // The reference pointer to the DOMNode, this is a wealth of
 information in itself.
   // look at the DOMNode class @
 http://www.php.net/manual/en/ref.dom.php
 protected $DOMNode = null;
   
 protected function __construct($DOMNode, $name, $id = null) 
   {
   $this-DOMNode = $DOMNode;
   $this-name = $name;
   $this-id = $id;
 } //__construct()
 
 
   function getValue() 
   {
   //check for multiple values, such as a list of 
 names perhaps
 [#74] if ($this-DOMNode-childNodes-length  1)
   {
   foreach ($this-DOMNode-childNodes as 
 $tmpNode) 
   $tmpArray[] = $tmpNode-nodeValue;
   return $tmpArray;
   }
   else
 [#81] return $this-DOMNode-nodeValue;
   }
 }
 
 class is_username extends XMLRule
 {
   function __construct($DOMNode, $id = null) {
 parent::__construct($DOMNode, 'Username', $id); }
 }
 
 class is_day extends XMLRule
 {
   function __construct($DOMNode, $id = null) {
 parent::__construct($DOMNode, 'Day', $id); }
 }
 
 ...etc...
 
 ##
 ##
 #
 
 // IMPORTANT: You *MUST* declare the class *BEFORE* you call
 session_start(). 
 // If you run session_start() before the definition of the class, 
 // the session variables of the objects will be corrupted.
 // http://www.zend.com/phorum/read.php?num=3id=36854thread=36847
 
 require_once('classes/rule_xml.class.php');
 
 if (!isset($_SESSION['ruleArray']))
 {
   $XMLDOC = new DOMDocument();
   $XMLDOC-loadXML($xmlstring);
   
   $ruleArray = array();
   $i = 1;
   $or = 1;
   foreach($XMLDOC-firstChild-childNodes as $myNode)
   {
   if ($myNode-nodeName == 'and_conditions')
   {
   foreach($myNode-childNodes as $cNode)
   {
   $key = (string)($cNode-nodeName);
   //make a new instance of the node name'd
 class
   $ruleArray[$or][$i] = new 
 $key($cNode, $i); 
   $i++;
   }
   
   $or++; //begin new OR block
   } //if and_conditions
   } //foreach $myNode
   
   $_SESSION['ruleArray'] = serialize($ruleArray);
 }
 else $ruleArray = unserialize($_SESSION['ruleArray']);
 
 I've tried this with the un/serialize and without. PHP5 is supposed to
 handle that for me, but just in case, I tried it anyways.
 
 If I don't use the $SESSION, then things work fine and I have 
 my values.
 
 I also tried to do this:
 
   $_SESSION['ruleArray'] = $ruleArray;
   $ruleArray = $_SESSION['ruleArray'];
 
 And surprisingly that works (although it doesn't solve my problem).
 
 ##
 ##
 #
 Upon loading this back, this is what the array looks like in 
 either case
 (working or not)
 
 Array
 (
 [1] = Array
 (
 [1] = is_username Object
 (
 [name:protected] = Username
 [DOMNode:protected] = DOMElement Object