Bug #66248 [Opn->Nab]: Object redeclaration

From: Date: Tue, 10 Dec 2013 18:00:35 +0000
Subject: Bug #66248 [Opn->Nab]: Object redeclaration
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-183229@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=66248&edit=1

 ID:                 66248
 Updated by:         requinix@php.net
 Reported by:        info at ferenczigabor dot com
 Summary:            Object redeclaration
-Status:             Open
+Status:             Not a bug
 Type:               Bug
 Package:            Class/Object related
 PHP Version:        Irrelevant
 Block user comment: N
 Private report:     N

 New Comment:

That's not what I'm talking about.

Please find a mailing list or forum to get further help with your script. In the mean time I'm
still quite sure this isn't a bug with PHP but with your code instead.
http://www.php.net/support.php


Previous Comments:
------------------------------------------------------------------------
[2013-12-10 11:18:11] info at ferenczigabor dot com

How can I send the xml files? I can't see any form-field, or button for sending or upload
files? Is it good the "Add a Patch" button? T'm gona to send on that. Please delete
the first line, than rename that as xml.

------------------------------------------------------------------------
[2013-12-10 09:29:35] requinix@php.net

$xml_file = "http://paskal-bt.hu/bakny/PHP-cimlista-proba.xml";
$dom->save($xml_file);

You cannot save to a file over the internet. Change $xml_file to be a local file path, and a file
path that your script has write access to. Any change in behavior?

------------------------------------------------------------------------
[2013-12-10 08:22:19] info at ferenczigabor dot com

<?php
//the entire code's language is Hungarian, please excuse me for the funny mixture of the
English and Hungarian
define("max_mail",10);
define("CrLf","\r\n");
define("Cr","\n");

//link for the xml file: http://paskal-bt.hu/bakny
$xml_file = "http://paskal-bt.hu/bakny/PHP-cimlista-proba.xml";
$xml_sablon = "http://paskal-bt.hu/bakny/PHP-xml_sablon.php";

$dom = new DOMDocument('1.0', 'iso-8859-2');
if (!file_exists($xml_file)) {
$dom->loadXML($xml_sablon);
$dom->save($xml_file);
} //if f_exists 
else {
$dom->load($xml_file);
}	//else
$cimlista = $dom->getElementsByTagName('Cimlista');
$napi_mail_szam = 0;

$dom = new DOMDocument('1.0', 'ISO-8859-2');	//this is the second
instanciateting of the $dom object
if (!$dom->load($xml_file)) {
  echo "Error while parsing the document: $xml_file\n";
  exit;
}

$dom->formatOutput = true;

$items = $dom->getElementsByTagName('E-mail');
for ($i=0; $i < $items->length ; $i++) {
$mail_items_tomb[$i] = $items->item($i)->nodeValue;
}//for i

$items = $dom->getElementsByTagName('Elkuldve');
for ($i=0; $i < $items->length ; $i++) {
$elkuldve_items_tomb[$i] = $items->item($i)->nodeValue;
}//for i
$i = 0;	$tomb_meret = count($mail_items_tomb);
$elkuldve_valasz = "1";

while ($i < $tomb_meret)  {
$akt_elem = $cimlista->item($i);

$siker = true;	//in the entire PHP code $siker is the result of a mail() function. For the 20 lines
maximum code-size I deleted all the lines, which are unrelevants.
if ($siker) {
$akt_elem->getElementsByTagName('Elkuldve')->item(0)->nodeValue =
$elkuldve_valasz;
echo $akt_elem->getElementsByTagName('Elkuldve')->item(0)->nodeValue;	//this line
is not in the entire code, I inserted only for demonstrating the bug.
}	//if siker
++$i;
}	//while vége
$dom->saveXML();//this line is not in the entire code, I inserted only for demonstrating the bug.
$dom->normalize;
//$dom->save($xml_file);	//the entire code save the new xml database file here. I commented out
this line only for the PHP demonstration.
echo "Az eredmény mentve";
?>

------------------------------------------------------------------------
[2013-12-09 18:42:08] requinix@php.net

Thank you for this bug report. To properly diagnose the problem, we
need a short but complete example script to be able to reproduce
this bug ourselves. 

A proper reproducing script starts with <?php and ends with ?>,
is max. 10-20 lines long and does not require any external 
resources such as databases, etc. If the script requires a 
database to demonstrate the issue, please make sure it creates 
all necessary tables, stored procedures etc.

Please avoid embedding huge scripts into the report.

--

I get the correct (expected) behavior using

<?php

$xml = <<<XML
<root><node1><node2>empty</node2></node1></root>
XML;

$dom = new DOMDocument("1.0", "iso-8859-2");
$dom->loadXML($xml);

$dom = new DOMDocument("1.0", "iso-8859-2");
$dom->loadXML($xml);

$node1 = $dom->getElementsByTagName("node1")->item(0);
$node1->getElementsByTagName("node2")->item(0)->nodeValue = "full";

echo $dom->saveXML();
// <root><node1><node2>full</node2></node1></root>

?>

------------------------------------------------------------------------
[2013-12-09 16:53:32] info at ferenczigabor dot com

Description:
------------
I unwittingly instantiated an XML object twice, and I expereienced peculiar behavior.
(I indicate the irrelevant lines in the description with "..." sign.
The mentioned XML file contains <addresses> elements, and each element contain a <sent>
item:
...
<dataroot>
<asdresses>
...
<address/>
<sent/>
...
</addresses>
<asdresses>
...
<address/>
<sent/>
...
</addresses>
</dataroot>
...).
The PHP version: PHP Version 5.2.4-2ubuntu5.27
I have no chance to upgrade the PHP, because my page is on a provider's server, which runs this
version.


<?php
...
...

$dom = new DOMDocument('1.0', 'iso-8859-2');
...
$dom->load($xml_file);
...
...
...
$dom = new DOMDocument('1.0', 'iso-8859-2');//this is the redeclaration
...
$dom->load($xml_file);
...
...
$address = $dom->getElementsByTagName('addresses');

//Later I filled the "sent" item with the number of sent items:
...
while ($i < $i_counter) ) {
...
$akt_item = $address->item($i);//$i is the actual node in the XML file.
...
$sent_number++;	// the actual naumber of the sent items for the <address>
$akt_item->getElementsByTagName('sent')->item(0)->nodeValue = $sent_number;
//for debug reason I printed the new value of the node:
echo $akt_item->getElementsByTagName('sent')->item(0)->nodeValue;
//the printed number was the expected new value, so that $sent_number
...
//Finally I tried to print the changed XML file:
echo $dom->saveXML();
...
?>
The last echo prompt printed out the unchanged XML data! So that all the <sent> elements'
value remained NULL!
(After I had removed the unwanted redeclaration, the code functioned properly).

This is a bug. Why?
Whenever I declare a variable:
$x = "Some value";
...
then I use this variable again:
$x = "Other value";
From the last decalaration line $x's value strictly will be "Other value".
But my described code used sometime the first instance of the "$dom" (in the
"saveXML" method), sometime the second instance (in the "...->nodeValue =
..." and the "echo ...nodeValue"); or v.s.
I guess, the good solution should be to overload the older declaration with the newest one, or to
arise an error.
Gabor Ferenczi


Test script:
---------------
<?php
...
...

$dom = new DOMDocument('1.0', 'iso-8859-2');
...
$dom->load($xml_file);
...
...
...
$dom = new DOMDocument('1.0', 'iso-8859-2');//this is the redeclaration
...
$dom->load($xml_file);
...
...
$address = $dom->getElementsByTagName('addresses');

//Later I filled the "sent" item with the number of sent items:
...
while ($i < $i_counter) ) {
...
$akt_item = $address->item($i);//$i is the actual node in the XML file.
...
$sent_number++;	// the actual naumber of the sent items for the <address>
$akt_item->getElementsByTagName('sent')->item(0)->nodeValue = $sent_number;
//for debug reason I printed the new value of the node:
echo $akt_item->getElementsByTagName('sent')->item(0)->nodeValue;
//the printed number was the expected new value, so that $sent_number
...
//Finally I tried to print the changed XML file:
echo $dom->saveXML();
...
?>



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=66248&edit=1


Thread (6 messages)

« previous php.bugs (#183229) next »