2013-10-23 33 views
0

我無法使用PHP從XML文件中刪除記錄。XML和PHP - 使用表格刪除記錄 - 致命錯誤

我不斷收到以下錯誤:

Fatal error: Cannot use object of type DOMElement as array in /Applications/XAMPP/xamppfiles/htdocs/catalogue/deleteaction.php on line 19

這是代碼:

XML

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="catalogue_overview.xsl"?> 

<catalogue> 
    <record> 
    <catId>001</catId> 
    <title>Fungus</title> 
    <location>GP</location> 
    <photographer>jrm</photographer> 
    <equipment>Canon EOS 40D</equipment> 
    <caption>Small fungus</caption> 
    <notes>This is a very rare species of fungus</notes> 
    <date>10/8/2012</date> 
    <imageUrl>images/IMG_1684.jpg</imageUrl> 
    </record> 
</catalogue> 

PHP cataloguedelete.php

!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Photo Catalogue - Delete Entry</title> 

<link rel="stylesheet" type="text/css" href="css/style.css"/> 

</head> 

<body> 


    <h1>Delete Entry From Catalogue</h1> 

    <p>DDDDDDD</p> 

<? 
echo "<form action='deleteaction.php' method='post'>\n"; 
$doc = new DOMDocument(); 
$doc->load('catalogue.xml'); 
$catdelete = $doc->getElementsByTagName("record"); 
foreach($catdelete as $record) { 

    $catIds = $record->getElementsByTagName("catId"); 
    $catId = $catIds->item(0)->nodeValue; 

    $titles = $record->getElementsByTagName("title"); 
    $title = $titles->item(0)->nodeValue; 

    $locations = $record->getElementsByTagName("location"); 
    $location = $locations->item(0)->nodeValue; 

    $photographers = $record->getElementsByTagName("photographer"); 
    $photographer = $photographers->item(0)->nodeValue; 

    $equip = $record->getElementsByTagName("equipment"); 
    $equipment = $equip->item(0)->nodeValue; 

    $captions = $record->getElementsByTagName("caption"); 
    $caption = $captions->item(0)->nodeValue; 

    $note = $record->getElementsByTagName("notes"); 
    $notes = $note->item(0)->nodeValue; 

    $dates = $record->getElementsByTagName("date"); 
    $date = $dates->item(0)->nodeValue; 

    echo "<input type='checkbox' name='EntriesToRemove[]' value='" . $catId . "'> $title, &quot;$location&quot;<br>\n"; 
} 
echo "<br><input type='submit' value='Delete Entry' />\n</form>\n"; 
?> 

</body> 
</html> 

deleteaction.php

<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Untitled Document</title> 
</head> 

<body> 

<? 
$entries_to_remove = $_POST['EntriesToRemove']; 


$doc = new DOMDocument(); 
$doc->load("catalogue.xml"); 

$catalogue = $doc->getElementsByTagName("catalogue"); 
foreach($catalogue as $record) { 
    if($record['catId'] == $_POST["EntriesToRemove"]) { 
     // unset($record); 
     $catalogue->removeChild($record); 
    } 
} 
$doc->save("catalogue.xml"); 
?> 

</body> 
</html> 

的錯誤就行了:

if($record['catId'] == $_POST["EntriesToRemove"]) { 

我相信這是服用點簡單的我已經錯過了

任何意見,將不勝感激

許多謝謝

+0

這是非常類似於此查詢,但沒有幫助:http://stackoverflow.com/questions/19168009/php-delete-xml-基於tag-elements-on-selected-checkbox-array- – pelagos

回答

1

您已將EntriesToRemove設置爲HTM中的陣列L - 因此您需要檢查catId是否是該數組的一個元素,而不是等於它(如鏈接的答案中所建議的那樣)。但你也需要正確地從DOM文檔搶CATID值(它不是一個數組) - 你可以實際使用您在HTML中使用的代碼要做到這一點,是這樣的:

foreach($catalogue as $record) { 
    // Get the CatIds from this record 
    $catIds = $record->getElementsByTagName("catId"); 
    // get the first CatId (you might actually want to check this exists 
    // first if you can't be sure the XML contains that key) 
    $catId = $catIds->item(0)->nodeValue; 
    // Look to see if the given catId is in the $_POST array 
    if (in_array($catId, $_POST['EntriesToRemove'])) { 
     // Found it! 
    } 
} 

...應該做的伎倆。

編輯我們通過<record>條目循環的方式也存在問題。而且,由於DOMDocument在您執行removeChild時被修改的方式,因此無法在foreach循環中刪除(請參閱此處的評論:DOMNode::removeChild)。您需要做的是存儲您想要刪除的節點的副本,然後將其刪除到循環之外。

所以,我們最終得到的是:

$catalogue = $doc->getElementsByTagName("catalogue"); 
$records= $doc->getElementsByTagName('record'); 
$nodeToRemove= null; 

foreach($records as $record) { 
    // Get the CatIds from this record 
    $catIds = $record->getElementsByTagName("catId"); 
    // get the first CatId (you might actually want to check this exists 
    // first if you can't be sure the XML contains that key) 
    $catId = $catIds->item(0)->nodeValue; 
    // Look to see if the given catId is in the $_POST array 
    if (in_array($catId, $_POST['EntriesToRemove'])) { 
     // Found it! Store it for removal 
     $nodeToRemove= $record; 
    } 
} 

if ($nodeToRemove!=null) { 
    $oldnode= $nodeToRemove->parentNode->removeChild($nodeToRemove); 
} 
$doc->save('catalogue.xml'); 
+0

正如你毫無疑問猜測我是一個新手。感謝您的快速回復!在替換你的代碼後,我似乎仍然得到相同的錯誤。我把它放在deleteaction.php文件中,我得到了同樣的錯誤。然後我在cataloguedelete.php中嘗試了它,現在我仍然在形式中得到這個錯誤。感謝您的任何建議。 – pelagos

+0

對不起pelagos - 我的「修復」中有一個錯誤!我留在了我們應該替換的$ record ['catId']中。我現在編輯了上面的答案。如果您使用該代碼替換'deleteaction.php'中的'foreach'循環(並將'cataloguedelete.php'保持原樣),那麼您應該沒問題。對不起 - 我的錯! – danielpsc

+0

謝謝。這已修復了錯誤,但實際上並未從xml文件中刪除記錄。我使用Dreamweaver。當我打開'cataloguedelete.php'並選擇要刪除的條目 - 點擊提交 - 我得到一個空白屏幕(之前我得到的錯誤)。當我回到Dreamweaver時,它說XML文件已被更改(我是否想重新加載它 - 我說是),但實際上並沒有任何更改...希望你能幫助! – pelagos