Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 最后一个XML项是';不能从XML中删除_Php_Xml_Simplexml - Fatal编程技术网

Php 最后一个XML项是';不能从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文档中

我有两个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);
    }
}