Php 取消与相对路径的链接不起作用


Php Unlink with relative path isnt working

我想取消链接文件。有数百个关于这个的帖子,但我似乎无法让它工作。

我从以下位置执行脚本:

public_html/dev/admin/delete.php

我尝试删除的文件位于:

public_html/dev/admin/upload/picture.jpeg

代码:

    $sql = "SELECT url FROM news WHERE id='$id'";
    $result = db::get_instance()->query($sql);
    if ($result->num_rows > 0) {
      while($row = $result->fetch_assoc()) {
        unlink($row['url']);
      }
    }

行 url 的内容 = upload/picture.jpeg

现在为什么这不起作用。Php 文档说相对垫很好用,如果我对吗?

编辑:

所以我发现如果我对网址进行硬编码,它可以工作:

unlink('upload/picture.jpeg');

但是当我使用以下方法时,它不会:

unlink($row[url]);

echo ($row[url]);印刷品:upload/picture.jpeg

是否可以使$row[url]不是字符串或其他东西?

Oke 所以$row['url']似乎在 url 中产生了额外的空格。

一个简单的trim($row['url'])修复了它!

谢谢大家!

确保路径正确$row['url']并且文件具有正确的权限。

始终使用具有绝对路径的文件系统例程是一个非常非常好的主意,这样就不会有"相对"错误。在错误的文件夹中删除错误的文件可能会付出高昂的代价!

因此,在每个文件系统链接前面加上$_SERVER['DOCUMENT_ROOT']并可能进行硬编码或使用getcwd()来获取当前目录(通常是 PHP 文件所在的目录)。

给你:

// remove potential double slashes in complete address.
// Also add trailing slash before the $row
 $currentWD = ltrim(getcwd(),"/")."/";
 unlink($_SERVER['DOCUMENT_ROOT'].$currentWD.$row['url']);

哪里:

$_SERVER['DOCUMENT_ROOT'] == "home/public_html/"
getcwd() == "/dev/admin"
$row['url'] == "upload/picture.jpeg"

另请注意,在Apache系统(以及我认为的大多数其他系统)上,该文件系统是CasE SensiTiVe!!


另外,请注意在数组键周围使用引号,您希望$row['url']带有(单)引号而不是没有引号。


编辑:一些调试:

  • 什么是echo getcwd()?这应该是当前文件夹。

  • 您的字符串是否正确进行了字符编码,以便它正在寻找的文件系统的字母是正确的字母,而不是看起来相同但不完全相同的加密或类似字母(我知道这很晦涩,但是......

发现差异?

public_html/dev/admin/upload/picture.png
                                     ^^^
unlink('upload/picture.jpeg');
                       ^^^^