Matty999555 Posted June 20, 2010 Share Posted June 20, 2010 I've been using SimpleXML for most of my xml functions but as it doesn't contain functions for deleting elements. I have come across problems such as : Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' PHP Code: session_start(); if(!empty($_GET['delid']) && $_SESSION['login'] == "true" && !empty($_GET['article'])) { if($_SESSION['level'] == "rootuser" || $_SESSION['level'] == "admin" || $_SESSION['level'] == "moderator") { $comments['article'] = $_GET['article'] . ".xml"; $doc = new DOMDocument(); $doc->load("../../xml/" . $comments['article'] . ".comments"); $count = 0; $searchNodes = $doc->getElementsByTagName("comment")->item(0); foreach($searchNodes as $searchNode) { $check = preg_replace("/%20/", "", $_GET['delid']); $valueID = $searchNode->getElementsByTagName("id")->item(0); //if($valueID == $check) { $doc = $doc->removeChild($searchNode); $deleted = "deleted"; //} $count = $count + 1; } // Fine below if($deleted == "deleted") { $doc->save("../../xml/" . $comments['article'] . ".comments"); header("Location: /error.php?title=Comment%20Deleted&msg=Comment%20Deleted"); } else { header("Location: /error.php?title=Error&msg=ID%20Does%20Not%20Exist!"); } } else { header("Location: /error.php?title=Error!&msg=You%20do%20not%20have%20Permission%20to%20delete%20Comments!"); } } My code is above and this is a sample file: Code: <?xml version="1.0"?> <index> <about>Comments Ver 1.0</about> <comment><name>Matthew</name><email>n/a</email><website/><content>Content</content><time>Friday 18th of June 2010 08:23:40 AM</time><ip>n/a</ip><id>08:23:40, 18062010</id></comment></index> It is meant to be access like this: ?delid=08:23:40,%2018062010&article=test However I cannot find a working solution to my problem. I know that it it these two lines which are causing it. $searchNodes = $doc->getElementsByTagName("comment")->item(0); $valueID = $searchNode->getElementsByTagName("id")->item(0); Can someone help me, thanks. Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/ Share on other sites More sharing options...
Matty999555 Posted June 20, 2010 Author Share Posted June 20, 2010 Please, If you need more of the source code to help I'll give it to you. Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1074576 Share on other sites More sharing options...
Cless Posted June 20, 2010 Share Posted June 20, 2010 Pretty sure that kind of error is in relation to removeChild. Hence, you're attempting to delete an element that does not exist, or so it seems. When does this happen? Also, is there any more to the error code? Such as line numbers, etc. Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1074592 Share on other sites More sharing options...
Matty999555 Posted June 20, 2010 Author Share Posted June 20, 2010 Pretty sure that kind of error is in relation to removeChild. Hence, you're attempting to delete an element that does not exist, or so it seems. When does this happen? Also, is there any more to the error code? Such as line numbers, etc. That happened a little while ago, it doesn't happen at the mo. What I think is wrong Is that I am failing to properly locate the element so nothing is deleted. Full code: <?php /* COMMENT BLOCK * THIS IS THE SAME LENGTH AS IT WAS ORIGINALLY * I HAVE JUST REMOVED THE DETAILS * * * * * * * * * * * * **********************************************************************************/ session_start(); if(!empty($_GET['delid']) && $_SESSION['login'] == "true" && !empty($_GET['article'])) { if($_SESSION['level'] == "rootuser" || $_SESSION['level'] == "admin" || $_SESSION['level'] == "moderator") { $comments['article'] = $_GET['article'] . ".xml"; $doc = new DOMDocument(); $doc->load("../../xml/" . $comments['article'] . ".comments"); $count = 0; $searchNodes = $doc->getElementsByTagName("comment")->item(0); foreach($searchNodes as $searchNode) { $check = preg_replace("/%20/", "", $_GET['delid']); $valueID = $searchNode->getElementsByTagName("id")->item(0); //if($valueID == $check) { $doc = $doc->removeChild($searchNode); $deleted = "deleted"; //} $count = $count + 1; } // Fine below if($deleted == "deleted") { $doc->save("../../xml/" . $comments['article'] . ".comments"); header("Location: /error.php?title=Comment%20Deleted&msg=Comment%20Deleted"); } else { header("Location: /error.php?title=Error&msg=ID%20Does%20Not%20Exist!"); } } else { header("Location: /error.php?title=Error!&msg=You%20do%20not%20have%20Permission%20to%20delete%20Comments!"); } } elseif(!empty($_GET['article'])) { if(preg_match("/^[a-zA-Z0-9_-]*$/", $_GET['article'])) { if(preg_match("/^[a-zA-Z0-9_-\s]*$/", $_POST['name'])) { if(preg_match("/^[a-zA-Z0-9_-\s\[\],.:;\"'\(\)\\/]*$/", $_POST['comment'])) { if(preg_match("(\w+@[a-zA-Z_]+?\.[a-zA-Z])", $_POST['email']) || $_POST['email'] == "userloggedinnoneedtocheck") { $comments['article'] = htmlentities($_GET['article']) . ".xml"; $comments['name'] = htmlentities($_POST['name']); $comments['email'] = htmlentities($_POST['email']); $comments['comment'] = htmlentities($_POST['comment']); if(preg_match("([http://]\w+.+w|[http://www.]\w+.+w|[http://]\w+.+w+.+w|[http://www.]\w+.+w+.+w)", $_POST['website']) || empty($_POST['website'])) { $comments['website'] = htmlentities($_POST['website']); } $comments['time'] = date('l jS \of F Y h:i:s A'); $ipadress = $_SERVER['REMOTE_ADDR']; $returnlink = $_SERVER['HTTP_REFERER']; if(empty($_POST['name']) || empty($_POST['email']) || empty($_POST['comment'])) { header("Location: /error.php?title=Error&msg=You%20didn't%20fill%20in%20a%20required Field!"); } else { if(file_exists("../../xml/" . $comments['article'] . ".comments")) { $doc = new DOMDocument(); $doc->load("../../xml/" . $comments['article'] . ".comments"); $root = $doc->getElementsByTagName("index")->item(0); $doc->appendChild($root); $comment = $doc->createElement("comment"); $root->appendChild($comment); $element = $doc->createElement("name"); $element->appendChild($doc->createTextNode($comments['name'])); $comment->appendChild($element); $element = $doc->createElement("email"); $element->appendChild($doc->createTextNode($comments['email'])); $comment->appendChild($element); $element = $doc->createElement("website"); $element->appendChild($doc->createTextNode($comments['website'])); $comment->appendChild($element); $element = $doc->createElement("content"); $element->appendChild($doc->createTextNode($comments['comment'])); $comment->appendChild($element); $element = $doc->createElement("time"); $element->appendChild($doc->createTextNode($comments['time'])); $comment->appendChild($element); $element = $doc->createElement("ip"); $element->appendChild($doc->createTextNode($ipadress)); $comment->appendChild($element); $element = $doc->createElement("id"); $element->appendChild($doc->createTextNode(date("H:i:s, dmY"))); $comment->appendChild($element); $commentfile = file_get_contents("../../xml/" . $comments['article'] . ".comments"); if(strpos($_SERVER["REMOTE_ADDR"], $commentfile)) { header("Location: /error.php?title=Error&msg=You%20have%20already%20posted%20a%20Message!"); } $doc->save("../../xml/" . $comments['article'] . ".comments"); header("Location: /error.php?title=Comments%20Saved&msg=Thanks%20for%20submitting%20a%20comment"); } else { header("Location: /error.php?title=Error&msg=Comments%20are%20not%20enabled%20for%20this%20page!%20Please%20update%20links"); } } } else {header("Location: /error.php?title=Invalid Email!&msg=The%20email%20entered%20was%20invalid!");} } else {header("Location: /error.php?title=Invalid%20Comment!&msg=You%20put%20a%20forbidden%20character%20in%20the%20message!");} } else {header("Location: /error.php?title=Invalid%20Name!&msg=You%20didn't%20fill%20in%20your%20name%20Correctly!");} } else {header("Location: /error.php?title=Invalid%20ID!&msg=We're%20sorry%20to%20say%20that%20the%20ID%20was%20Invalid");} } else { header("Location: /index.php"); } die("ERROR"); ?> I can think of a different way to do this. I'm going to try in a sec Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1074594 Share on other sites More sharing options...
Matty999555 Posted June 20, 2010 Author Share Posted June 20, 2010 I think this is wrong: $searchNodes = $doc->getElementsByTagName("comment")->item(0); It should be $searchNodes = $doc->getElementsByTagName("comment"); EDIT Tried this: $count = 0; $searchNodes = $doc->getElementsByTagName("id"); foreach($searchNodes as $searchNode) { $check = preg_replace("/%20/", "", $_GET['delid']); if($searchNode == $check) { $remove = $doc->getElementsByTagName("comment")->item($count); $doc = $doc->removeChild($remove); $deleted = "deleted"; } $count = $count + 1; } Didn't work Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1074595 Share on other sites More sharing options...
Cless Posted June 21, 2010 Share Posted June 21, 2010 So there's no error messages? The only thing wrong is that it is not properly deleting the element and writing it to the file? Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1074801 Share on other sites More sharing options...
Matty999555 Posted June 21, 2010 Author Share Posted June 21, 2010 Theres no error message because of this line: if($searchNode == $check) { It would redirect to the page: /error.php ANd put up an error that way. Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1074888 Share on other sites More sharing options...
Cless Posted June 22, 2010 Share Posted June 22, 2010 Well, I spent over an hour trying to figure this out, and I think I've finally figured it out. <?php if(!empty($_GET['delid']) && $_SESSION['login'] == "true" && !empty($_GET['article'])) { if($_SESSION['level'] == "rootuser" || $_SESSION['level'] == "admin" || $_SESSION['level'] == "moderator") { $comments['article'] = $_GET['article'] . ".xml"; $doc = new DOMDocument(); $doc->load("../../xml/" . $comments['article'] . ".comments"); $searchNodes = $doc->getElementsByTagName("comment"); $domElemsToRemove = array(); foreach($searchNodes as $searchNode) { $check = preg_replace("/%20/", "", $_GET['delid']); $valueID = $searchNode->getElementsByTagName("id")->item(0)->nodeValue; if($valueID == $check) { $domElemsToRemove[] = $searchNode; } } foreach( $domElemsToRemove as $domElement ){ $domElement->parentNode->removeChild($domElement); $deleted = "deleted"; } if($deleted == "deleted") { $doc->save("../../xml/" . $comments['article'] . ".comments"); header("Location: /error.php?title=Comment%20Deleted&msg=Comment%20Deleted"); } else { header("Location: /error.php?title=Error&msg=ID%20Does%20Not%20Exist!"); } } else { header("Location: /error.php?title=Error!&msg=You%20do%20not%20have%20Permission%20to%20delete%20Comments!"); } } ?> First of all: if($valueID == $check) $valueID was not a string, and thus could not be compared to one, so: $valueID = $searchNode->getElementsByTagName("id")->item(0)->nodeValue; nodeValue had to be added in order to get the text value of the ID and compare it to $check. Secondly, to remove the child successfully, I had to put it in an array then later use foreach() to delete it. Make sure that the XML file has proper file permissions to be modified and such. Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1075317 Share on other sites More sharing options...
Matty999555 Posted June 22, 2010 Author Share Posted June 22, 2010 Thank you so much !!! I will try in a sec. If possible in the future I'll stick to simpleXML Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1075432 Share on other sites More sharing options...
Cless Posted June 22, 2010 Share Posted June 22, 2010 No problem. o-o Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1075446 Share on other sites More sharing options...
Matty999555 Posted June 25, 2010 Author Share Posted June 25, 2010 FINALLLLLLLLLY tested it and it worked perfectly, thanks sooooooooo much Link to comment https://forums.phpfreaks.com/topic/205286-php-dom-help/#findComment-1077388 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.