我想取消链接文件。有数百个关于这个的帖子,但我似乎无法让它工作。
我从以下位置执行脚本:
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');
^^^^