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

From: Date: Tue, 10 Dec 2013 11:18:11 +0000
Subject: Bug #66248 [Fbk->Opn]: Object redeclaration
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-183221@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 User updated by: info at ferenczigabor dot com Reported by: info at ferenczigabor dot com Summary: Object redeclaration -Status: Feedback +Status: Open Type: Bug Package: Class/Object related PHP Version: Irrelevant Block user comment: N Private report: N New Comment: 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. Previous Comments: ------------------------------------------------------------------------ [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

« previous php.bugs (#183221) next »