Php unlink()删除文件,但返回false

Php unlink()删除文件,但返回false,php,unlink,Php,Unlink,我有个问题,我解决不了。我试图删除一个文件并回显成功消息,但它删除了文件但返回false。这是我的密码: if(unlink(".".MEDIA_PATH."/$av")){ exit(header("Location: page.php?&msg=success")); } else{ exit(header("Location: page.php?msg=fail")); } 德国的丹帮了我解决方案是:不要使用Windows编程,使用Li

我有个问题,我解决不了。我试图删除一个文件并回显成功消息,但它删除了文件但返回false。这是我的密码:

if(unlink(".".MEDIA_PATH."/$av")){          
    exit(header("Location: page.php?&msg=success"));
}
else{
    exit(header("Location: page.php?msg=fail"));    
}

德国的丹帮了我解决方案是:不要使用Windows编程,使用Linux:)错误是因为我在Windows操作系统上使用localhost。

确保文件存在,然后使用“file\u exists”函数将其删除(“unlink”可以在同时调用两个实例的情况下调用,但对于测试来说并不重要)

如果工作流出现故障,并且unlink函数被调用了两次,您将很容易注意到它


您还可以使用带中断的xdebug来测试代码。

我找到了一个解决方案,但它不是最好的。如果你有,请帮助我

这是我的解决方案:

$del_file=".".MEDIA_PATH."/$av"; 

// Deleting file from server
@unlink($del_file); 

if(!file_exists($del_file)){                
    exit(header("Location: page.php?&msg=success"));
}
else{
    exit(header("Location: page.php?&msg=fail"));   
}
它仍然在unlink()上给出错误false,所以我在unlink()上添加了@operator来屏蔽它,但这不是我想要的。因为我在本地主机(windows)上,而不是在live server上,这有关系吗


看起来func unlink()运行了两次,第一次删除文件,第二次返回false错误,因为它找不到指定的文件。

我稍微更改了您的代码

首先检查文件是否存在,然后删除

$file = '.' . MEDIA_PATH . '/' . $av;

if (file_exists($file)) {
    if (unlink($file)) {          
        header("Location: page.php?msg=success");
    } else {
        header("Location: page.php?msg=fail&reason=cannot-delete");
    }
} else {
    header("Location: page.php?msg=fail&reason=file-not-exists");
}

exit;
更新:

已知在windows系统上有时会出现故障。

Luka Rogovic:

看起来func unlink()运行了两次,第一次删除 文件和secund time返回false错误,因为它找不到 指定的文件

试试这个:

$filePath = "." . MEDIA_PATH . "/$av";

if( !filter_has_var(INPUT_GET, 'msg') ) {
    if( !file_exists ) {
        exit(header("Location: page.php?msg=fail&reason=file-does-not-exist")); 
    } else if( unlink($filePath) ) {
        exit(header("Location: page.php?&msg=success"));
    } else{
        exit(header("Location: page.php?msg=fail&reason=cannot-delete"));
    }
}
我相信“page.php”被调用了两次,“unlink”被调用了两次

条件“!filter_has_var(INPUT_GET,'msg')”可防止这种情况发生

然而,您应该理解为什么“解决方案”起作用:
使用浏览器中的“Inspect element”分析重定向,并使用xdebug查看是否调用了两次“unlink”。

如果
unlink
失败,它将(如果启用)输出
E\u警告,导致未设置标题(输出文本后无法设置标题)。使用绝对可怕的错误抑制运算符
@
修复此行为(
@unlink()
)。注意:
@
的使用应该非常有限!。另外请注意,如果
$av
。/page.php
或另一个相对路径,则您有权删除整个服务器。请验证当前的错误设置是否允许您在出现警告时看到
E_警告。它会给出以下错误:警告:取消链接(../media/09.2014/1529759289.jpeg):第153行的C:\xampp\htdocs\test\gal\user.inc中没有此类文件或目录。。。但它会从服务器上删除它。是什么让你认为是你的代码删除了文件?症状表明该文件首先不存在:-?您确定不删除它两次吗?这没有帮助。当我只调用unlink()而不调用任何内容时,它会删除文件并返回false,错误为:“文件不存在…”。如果第一个条件返回TRUE,则输出错误消息(“文件不存在:…”),当然不会调用“unlink”,因为脚本以“exit”函数结束。如果这是项目中使用的唯一“取消链接”功能,并且在运行脚本之前存在要删除的文件,“page.php”似乎加载了两次:第一次“!file_exists”成功,“取消链接”成功,但第二次“!file_exists”失败。这是我最初的假设:(“如果工作流有问题…”)。调用page.php时是否使用了这段代码?您可以使用“Inspect element”检查是否调用了两次“page.php”。如果您使用的是Chrome浏览器:右键单击(您应该会看到上下文菜单),单击“检查元素”,然后单击“网络”选项卡。如果未激活,请单击“保留日志”复选框。刷新网页以删除文件。单击“过滤器”图标(左边的第三个,从红色圆圈开始)并搜索“page.php”。计算发生率:如果我的假设是正确的,他们比预期的要多。首先尝试了这个,但它不起作用。它跳转到标题(“位置:page.php?msg=fail&reason=file not exists”);当我注释unlink()时,文件在服务器上,没有任何更改,但当我取消注释unlink()时,它会从服务器上删除文件,并给出错误信息。我使用了你的解决方案,同样的事情也发生了。我百分之百确定没有其他东西会删除文件。@LukaRogovic我刚才注意到你在windows系统上工作。那么,您最好使用
@unlink()
。不是很好,但在这种情况下应该可以。我有Linux live server,但在Windows localhost上工作。这就是问题所在?谢谢你丹:)我需要改变我的操作系统!您可以尝试在windows主机上安装虚拟linux计算机:-)
$filePath = "." . MEDIA_PATH . "/$av";

if( !filter_has_var(INPUT_GET, 'msg') ) {
    if( !file_exists ) {
        exit(header("Location: page.php?msg=fail&reason=file-does-not-exist")); 
    } else if( unlink($filePath) ) {
        exit(header("Location: page.php?&msg=success"));
    } else{
        exit(header("Location: page.php?msg=fail&reason=cannot-delete"));
    }
}