Php 最后一个XML项是';不能从XML中删除
我有两个php文档具有相同的逻辑。一个文档是“uploader.php”,它在文件上传后写入xml。另一个文档是“modifier.php”,它将在删除文件后写入xml。我对这个逻辑有两个问题。第一个问题是删除xml列表中的最后一项。它不会删除最后一项,也会复制倒数第二项。第二个问题是它在我的“uploader.php”上记录了一个错误 第一期的示例 Image2.jpg是列表中的最后一项。若我要删除Image2.jpg,那个么倒数第二个项目将被复制,而Image2.jpg将保留在XML文档中Php 最后一个XML项是';不能从XML中删除,php,xml,simplexml,Php,Xml,Simplexml,我有两个php文档具有相同的逻辑。一个文档是“uploader.php”,它在文件上传后写入xml。另一个文档是“modifier.php”,它将在删除文件后写入xml。我对这个逻辑有两个问题。第一个问题是删除xml列表中的最后一项。它不会删除最后一项,也会复制倒数第二项。第二个问题是它在我的“uploader.php”上记录了一个错误 第一期的示例 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>
我认为这两个问题都与同一个问题有关,请帮我解决这个问题。谢谢
删除代码-此代码可以删除列表中除最后一项之外的任何项目
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.
}
if(isset($\u POST['delete'])){
foreach($\u POST['file']作为$file){
如果(isset($file)){
if(取消链接($path./“$file)){
echo“删除文件:$file
”;
如果(!empty($\u SERVER['HTTP\u REFERER'])){
标题(“位置:“.$”服务器['HTTP\u REFERER']);
}否则{
回应“无推荐人”;
}
}否则{
echo“未成功删除文件:$file
”;
}
}
}
//这里有最高级的代码。
}
但是,如果图像可以具有相同的名称或相等的名称,则此方法将失败。如果为每个上载的图像生成一个唯一的名称,这样图像就不会发生冲突,则效果会更好
更改此行:
$oldImage = $xml_generator->xpath('//images/image[id="'.$fileID.'"]');
if (!isset($oldImage))
致:
要避免出现这些通知,请更改以下内容:
else
{
$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);
}
}
$filename='../file.xml';
$xml=simplexml\u加载文件($filename);
如果(isset($_POST['delete']))
{
$deleted=0;
foreach($\u POST['file']作为$file)
{
如果(isset($file))
{
$image=$xml->xpath(“//images/image[name='$file']”);
如果(!空($image))
{
if(取消链接($path./“$file))
{
$deleted++;
$dom=dom\u import\u simplexml($image[0]);
$dom->parentNode->removeChild($dom);
echo“删除文件:$file
”;
如果(!empty($\u SERVER['HTTP\u REFERER']))
{
标题(“位置:“.$”服务器['HTTP\u REFERER']);
}
其他的
{
回应“无推荐人”;
}
}
其他的
{
echo“未成功删除文件:$file
”;
}
}
其他的
{
echo“未找到文件:$File
”;
}
}
}
//避免不必要的保存文件
如果($deleted>0)
{
$dom=新的DOMDocument('1.0');
$dom->preserveWhiteSpace=false;
$dom->formatOutput=true;
$dom->loadXML($xml->asXML());
$dom->save($filename);
}
}
请记住,这也将防止人们删除XML上不存在的文件,就像他们将POST请求更改为其他不存在的文件一样。删除图像的代码是什么?为什么不使用图像哈希而不是顺序id?为什么不改用MySQL呢?我将这个XML文档与客户端的许多其他XML文档一起使用。我已经找到了那个密码。出于这个原因,我认为坚持使用XML会更容易。那么您的删除图像代码是什么呢?我马上会发布删除代码。谢谢你的帮助。我刚刚发布了删除代码。@Tierendu再看一看,我已经更新了代码以更正删除文件上的一个问题。您好@Prix,我使用的是您最新的代码示例,但它没有从XML中删除文件,而是转到
无法删除文件:
语句。我一定是做错了什么。我只是想告诉你发生了什么。一如既往地感谢您的帮助。@Tierendu该文件不存在,或者您没有删除该文件的权限,因为它在取消链接时失败。
,您可以尝试使用该文件或将其放置在您的回音“没有…”下。
看看它告诉您什么错误。@Tierendu还有$\u POST['file'的内容是什么
能否更新打印文件($\u POST['file'])Tierendu <>代码> > //非常顶端代码到这里。在上面的代码中,你不需要运行顶级代码,除非你有新文件要更新,并且你应该明确地考虑迁移到MySQL,你的安装程序开始变得混乱,甚至你很难使用它。
$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);
}
}