Os últimos itens XML não são removíveis do XML

Eu tenho dois documentos php que tem essa mesma lógica. Um documento é “uploader.php, que escreve para o xml uma vez que o arquivo é carregado. O outro documento é” modify.php “, que grava no arquivo xml uma vez que foi removido. Eu tenho dois problemas com essa lógica. excluindo o último item na lista xml. Não exclui o último item e também duplica o segundo para os últimos itens. A segunda questão é que ele está registrando um erro no meu “uploader.php”.

$xml_generator = simplexml_load_file("../file.xml"); if ( $handle = opendir( $path_to_image_dir ) ) { while (false !== ($file = readdir($handle))) { if ( is_file($path.'/'.$file) && $file != "." && $file != ".." && $file != "Thumb.db" && $file != "Thumbs.db" && $file != ".DS_Store" ) { $fileID = $i++; list( $width, $height ) = getimagesize($path.'/'.$file); $oldImage = $xml_generator->xpath('//images/image[id="'.$fileID.'"]')[0]; if (!isset($oldImage)) { $image = $xml_generator->addChild('image'); $image->addChild('id', $fileID); $image->addChild('name', $file); $image->addChild('width', $width); $image->addChild('height', $height); $image->addChild('description', '-'); } else { $oldImage->name = $file; $oldImage->width = $width; $oldImage->height = $height; } } } closedir($handle); } $dom = new DOMDocument('1.0'); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; $dom->loadXML($xml_generator->asXML()); echo $dom->save('../file.xml'); 

Exemplo da primeira edição

Image2.jpg é o último item na lista. Se eu estivesse para excluir Image2.jpg, o segundo para o último item é duplicado enquanto Image2.jpg permanece no documento XML.

  9 Image1.jpg 2551 1435 -   10 Image1.jpg 2551 1435 -   11 Images2.jpg 612 612 -  

O segundo problema é a mensagem de erro .

 Undefined offset: 0 in uploader.php on line $oldImage = $xml_generator->xpath('//images/image[id="'.$fileID.'"]')[0]; 

Penso que ambas as questões estão relacionadas ao mesmo problema, por favor me ajude a resolver esse problema. Obrigado!

Código de exclusão – este código pode excluir qualquer item exceto o último item na lista.

 if(isset($_POST['delete'])){ foreach($_POST['file'] as $file) { if(isset($file)) { if (unlink($path."/".$file)) { echo "Delete the file: $file
"; if (!empty($_SERVER['HTTP_REFERER'])){ header("Location: " . $_SERVER['HTTP_REFERER']); } else { echo "No referrer."; } } else { echo "Didn't manage to delete the file: $file
"; } } } // very top code goes here. }

No entanto, essa abordagem falharia caso as imagens pudessem ter o mesmo nome ou ser iguais, o que seria melhor se você gerar um nome exclusivo para cada imagem carregada para que não colide.

Mude esta linha:

 $oldImage = $xml_generator->xpath('//images/image[id="'.$fileID.'"]'); if (!isset($oldImage)) 

Para:

 $oldImage = $xml_generator->xpath('//images/image[name="'.$file.'"]'); if (count($oldImage) == 0) 

Para evitar os avisos, altere isso:

 else { $oldImage->name = $file; 

Para:

 else { $oldImage = $oldImage[0]; $oldImage->name = $file; 

No seu arquivo de exclusão você terá que excluir o elemento para que ele não seja replicado.

Aqui está um exemplo:

 $filename = '../file.xml'; $xml = simplexml_load_file($filename); if(isset($_POST['delete'])) { $deleted = 0; foreach($_POST['file'] as $file) { if(isset($file)) { $image = $xml->xpath("//images/image[name='$file']"); if (!empty($image)) { if (unlink($path."/".$file)) { $deleted++; $dom=dom_import_simplexml($image[0]); $dom->parentNode->removeChild($dom); echo "Delete the file: $file
"; if (!empty($_SERVER['HTTP_REFERER'])) { header("Location: " . $_SERVER['HTTP_REFERER']); } else { echo "No referrer."; } } else { echo "Didn't manage to delete the file: $file
"; } } else { echo "File not found: $file
"; } } } // Avoid unnecessary saving the file if ($deleted > 0) { $dom = new DOMDocument('1.0'); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; $dom->loadXML($xml->asXML()); $dom->save($filename); } }

Tenha em mente que isso também impedirá as pessoas de excluir um arquivo que não exista no XML como se eles alterassem a solicitação POST para outra coisa que não.