为什么我无法删除文件(PHP)?

时间:2010-08-26 09:53:45

标签: php

我使用的表格从数据库中列出数据库中的数据,如标题,日期等,并使用复选框我使用多次删除操作

例如我的代码看起来像这样

<form method="post" action="action.php">
<input name="checkbox[]" type="checkbox" id="checkbox[]" value="<?php echo $row['id']; ?>"/>
<input name="delete" type="submit" id="delete" value="Delete"/>

并且在action.php中代码就像这样

 $checkbox = $_POST['checkbox'];
    //count the number of selected checkboxes in an array
    $count = count($checkbox);
    //Create a for loop to delete 
    for($i=0;$i<$count;$i++)   {
    $del_id = $checkbox[$i];
    $sql = "DELETE FROM news WHERE id='$del_id'";
    $result_delete_data = mysql_query($sql);
    }

现在我要删除的表实际上有5个表实体,如title,timestamp,pic_title,pic_brief,pic_detail最后三个实体,即pic_title,pic_brief和pic_detail实际上是存储图像的路径,例如存储在一个中的值3实体的内容看起来像upload/file/pic_title1.jpg

我的问题是,当我运行第一个for循环时,它成功删除了表没有任何问题,但文件目录中存在的文件保持不变。我也想要删除该文件,删除该文件,我想添加另一个for循环,我做了类似的事情

for($j=0;$j<$count;$j++){
        $delete_id = $checkbox[$j];
        $query = "SELECT news.pic_title, news.pic_brief, news.pic_detail FROM news WHERE id = '$delete_id'";
        $result = mysql_query($query);
        $row = mysql_fetch_array($result);
        unlink($row['pic_title']);
        unlink($row['pic_brief']);
        unlink($row['pic_detail']);
        }

上面的代码无法删除请求的文件,我的查询字符串完全正常工作我通过删除unlink函数并打印值测试它,它打印所有选定的值,但它拒绝删除文件和当我尝试运行循环时它在最后三行显示错误,而我很确定,$ row ['pic_title'],$ row ['pic_brief'],$ row ['pic_brief'],已满图像的路径。

    unlink($row['pic_title']);
    unlink($row['pic_brief']);
    unlink($row['pic_brief']);

我哪里出错?

P.S:文件权限没有任何问题,因为当我单独尝试运行unlink函数时,它会从同一目录中删除该文件。

编辑:这是我收到的错误消息

Warning: unlink() [function.unlink]: No error in C:\wamp\www\bn\admin-login\action.php on line 580

Warning: unlink() [function.unlink]: No error in C:\wamp\www\bn\admin-login\action.php on line 581

Warning: unlink() [function.unlink]: No error in C:\wamp\www\bn\admin-login\action.php on line 582

更准确地说,我在php中单独测试了这个功能,它工作得非常好

$target = 'upload/file/file1.jpg';
unlink($target);

由于这个原因,我不认为文件权限导致错误,我想我在逻辑上出错了。

@Lekensteyn给了我解决方案,谢谢Lekensteyn。

实际上我必须首先在变量中保存值,然后取消链接文件。工作代码看起来像这样。

 for($j=0;$j<$count;$j++){
        $delete_id = $checkbox[$j];
        $query = "SELECT * FROM news WHERE id = '$delete_id'";
        $result = mysql_query($query);
        $row = mysql_fetch_array($result);
        $pic_title = $row['pic_title'];
        $pic_brief = $row['pic_brief'];
        $pic_detail = $row['pic_detail'];
        unlink($pic_title);
        unlink($pic_brief);
        unlink($pic_detail);
        }

4 个答案:

答案 0 :(得分:1)

它可能是文件权限。您需要成为该文件的所有者才能将其删除。

某些托管商在用户'apache'(或类似版本)下运行该网站,但这些文件归ftpuser所有(例如accountxxxx)。

如果路径不是绝对路径,则使用echo getcwd()检查当前工作目录。

您的脚本也容易受到SQL注入攻击,checkbox[]='||1||'的帖子请求会删除所有内容。

答案 1 :(得分:1)

添加

error_reporting(E_ALL);

位于脚本的顶部。
您的问题与程序流有关,只能通过调试找到。
从显示发生的所有错误开始并修复它们。这很可能会导致您无法删除文件。

答案 2 :(得分:0)

上传的路径可能就是问题所在。在您的测试脚本中:

$target = 'upload/file/file1.jpg';
unlink($target);

我打赌你从'upload /'右下方的目录中运行了吗?

这个删除脚本,它可能不在同一个目录中?

我建议使用'upload / file /'目录的完整路径;这取决于您的配置,但可能看起来像/ www / htdocs / upload / file或/ var / www / public_html / upload / file。

为了使脚本更易于移植,您可以使用PHP常量 FILE 来确定目录。我通常在引导程序或通用配置文件中按照

的方式设置此应用程序/站点范围
define('PATH', dirname(__FILE__)); # sets PATH with the directory name of the bootstrap file where this code lives

我有时会依赖我可以依赖的路径中的某些内容,比如我的应用名称。说我的引导程序在这里:

/www/apps/golf-scorecard/bootstrap.php

我可能会分开'高尔夫记分卡'。

list($path,) = explode('golf-scorecard',dirname(__FILE__)); # $path should be /www/apps/
define('PATH', $path.'golf-scorecard'); # since I split on it, I have to add it back in

这意味着如果我将app / site移动到另一台服务器,或者将其从存储库克隆到文档根目录的机器上,比如说/home/username/apps/golf-scorecard/htdocs/,那么它就没关系了。它确实结合了应用程序名称,但我没关系。

答案 3 :(得分:0)

首先,您需要检查文件权限。您需要对该文件夹授予777权限。然后按照以下代码

$target = 'upload/file/file1.jpg';
unlink($target);