У меня возникли проблемы с удалением записи из файла XML с помощью PHP.
Я продолжаю получать следующую ошибку:
Неустранимая ошибка: нельзя использовать объект типа DOMElement как массив в /Applications/XAMPP/xamppfiles/htdocs/catalogue/deleteaction.php в строке 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, "$location"<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"]) {
Я уверен, что это простое прохождение, которое я пропустил
Любые советы будут высоко оценены
Большое спасибо
Вы установили, что EntriesToRemove
является массивом в HTML- EntriesToRemove
поэтому вам нужно проверить, является ли catId
элементом этого массива, а не равным ему (как указано в ответе, который вы связали). Но также вам нужно правильно захватить значение catId из DOMDocument (это не массив) - вы действительно можете использовать код, который вы используете в 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!
}
}
... должен сделать трюк.
EDIT. Также была проблема с тем, как мы перебирали <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');
foreach
в deleteaction.php
(и оставьте cataloguedelete.php
), все будет в порядке. Извините - моя вина!