0

我有两个具有相同逻辑的 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>

第二个问题是错误消息

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.
}
4

1 回答 1

0

但是,如果图像可以具有相同的名称或相同的名称,这种方法将失败,如果您为每个上传的图像生成一个唯一的名称,这样它就不会发生冲突,这会更好。

更改此行:

$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 请求更改为它不会删除的其他内容一样。

于 2013-07-18T21:53:40.607 回答