У меня есть два php-документа, которые имеют такую же логику. Один документ – «uploader.php», который записывает в xml один раз, когда файл загружается. Другой документ – «modifier.php», который записывает в xml один раз файл, который удален. У меня есть две проблемы с этой логикой. удаляя последний элемент в списке xml, он не удаляет последний элемент, а также дублирует второй на последний элемент. Вторая проблема заключается в том, что он регистрирует ошибку на моем «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');
Пример первого выпуска
Image2.jpg – последний элемент в списке. Если бы я должен был удалить Image2.jpg, то второй экземпляр будет дублироваться, а Image2.jpg останется в XML-документе.
<image> <id>9</id> <name>Image1.jpg</name> <width>2551</width> <height>1435</height> <description>-</description> </image> <image> <id>10</id> <name>Image1.jpg</name> <width>2551</width> <height>1435</height> <description>-</description> </image> <image> <id>11</id> <name>Images2.jpg</name> <width>612</width> <height>612</height> <description>-</description> </image>
Вторая проблема – ошибка Msg .
Undefined offset: 0 in uploader.php on line $oldImage = $xml_generator->xpath('//images/image[id="'.$fileID.'"]')[0];
Я думаю, что обе эти проблемы связаны с одной и той же проблемой, пожалуйста, помогите мне решить эту проблему. Благодаря!
Удалить код – этот код может удалить любой элемент, кроме последнего элемента в списке.
if(isset($_POST['delete'])){ foreach($_POST['file'] as $file) { if(isset($file)) { if (unlink($path."/".$file)) { echo "Delete the file: $file<br />"; if (!empty($_SERVER['HTTP_REFERER'])){ header("Location: " . $_SERVER['HTTP_REFERER']); } else { echo "No referrer."; } } else { echo "Didn't manage to delete the file: $file<br />"; } } } // very top code goes here. }
Однако этот подход не сработает, если изображения могут иметь одно и то же имя или быть одинаковыми, что было бы лучше, если бы вы создавали уникальное имя для каждого загруженного изображения, чтобы оно не сталкивалось.
Измените эту строку:
$oldImage = $xml_generator->xpath('//images/image[id="'.$fileID.'"]'); if (!isset($oldImage))
Для того, чтобы:
$oldImage = $xml_generator->xpath('//images/image[name="'.$file.'"]'); if (count($oldImage) == 0)
Чтобы избежать уведомлений, измените это:
else { $oldImage->name = $file;
Для того, чтобы:
else { $oldImage = $oldImage[0]; $oldImage->name = $file;
В вашем файле удаления вам придется исключить элемент, чтобы он не реплицировался.
Вот пример:
$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<br />"; if (!empty($_SERVER['HTTP_REFERER'])) { header("Location: " . $_SERVER['HTTP_REFERER']); } else { echo "No referrer."; } } else { echo "Didn't manage to delete the file: $file<br />"; } } else { echo "File not found: $file<br />"; } } } // 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); } }
Имейте в виду, что это также не позволит людям удалять файл, который не существует в XML, как если бы они меняли запрос POST на что-то другое, чего не было бы.