XML и PHP - Удалить запись с формой - Неустранимая ошибка

0

У меня возникли проблемы с удалением записи из файла 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, &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"]) {

Я уверен, что это простое прохождение, которое я пропустил

Любые советы будут высоко оценены

Большое спасибо

Теги:
xslt

1 ответ

1
Лучший ответ

Вы установили, что 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');
  • 0
    Как вы можете без сомнения догадаться, я новичок. Спасибо за быстрый ответ! Кажется, я все еще получаю ту же ошибку после замены вашего кода. Я поместил его в файл deleteaction.php и получаю ту же ошибку. Затем я попробовал это в cataloguedelete.php, и я все еще получаю эту ошибку, теперь она в форме. Спасибо за любой совет.
  • 0
    Извините, pelagos - в моем "исправлении" произошла ошибка! Я оставил в $ record ['catId'], который мы должны были заменить. Я отредактировал ответ выше сейчас. Если вы используете этот код для замены цикла foreach в deleteaction.php (и оставьте cataloguedelete.php ), все будет в порядке. Извините - моя вина!
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню