我使用的表格从数据库中列出数据库中的数据,如标题,日期等,并使用复选框我使用多次删除操作
例如我的代码看起来像这样
<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);
}
答案 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);