嗨伙计们,我试图创建一个ajax删除脚本为我的画廊,但它似乎没有删除,相反,它给出了以下错误。
Warning: Division by zero in /opt/lampp/htdocs/project/others/delete_photo.php on line 20
Warning: unlink(): No such file or directory in /opt/lampp/htdocs/project/others/delete_photo.php on line 20
删除脚本如下:
<?php
require $_SERVER["DOCUMENT_ROOT"].'/project/includes/dbconfig.inc.php';
$session= htmlentities($_SESSION['uname']);
$sess_uname= stripslashes($session);
$id0= htmlentities($_POST['id']);
$id= stripslashes($id0);
$sql="DELETE FROM photos WHERE id=':id' LIMIT 1";
$stmt=$conn->prepare($sql);
$stmt->bindparam(":id",$id);
$stmt->execute();
$sql1 = "SELECT * FROM photos WHERE user=':session' LIMIT 30";
$stmth=$conn->prepare($sql1);
$stmth->bindparam(":session",$sess_uname);
$stmth->execute();
$dir="user/$sess_uname";
$count0=$stmth->fetch(PDO::FETCH_ASSOC);
$count=count($count0);
$row1 = $stmth->fetch(PDO::FETCH_ASSOC);
if ($count>0) {
unlink($dir/$row1['filename']);
}
/*if (isset($_SESSION['app'])&&$_SESSION['uname']!="") {
header("location: ../home.php?u={$_SESSION['uname']}");
} else {
header("location: ../index.php?usernotfound?id=017");
}
*/
ajax逻辑如下:
$("button.delete_photo").click(function(){
var del_id = $(this).attr('id');
var del_attr=$(this).attr('attr');
$.post("others/delete_photo.php",
{id:del_id},function(data){
$("."+del_id).slideUp('slow', function() {$(this).remove(data);});
}
);
});
从头开始:
1) echo
,看看会得到什么?你得到想要的/期望的名字了吗?
echo $session= htmlentities($_SESSION['uname']);
如果是,echo
这个也:
$sess_uname= stripslashes($session);
2)同样,如果您通过echo
从
$id0= htmlentities($_POST['id']);
这意味着你的第一个查询应该工作。
现在,如果您已经从1) 得到预期的结果,下面的查询就可以工作了$sql1 = "SELECT * FROM photos WHERE user=':session' LIMIT 30";
3)这不是正确的分配目录的方式。
$dir="user/$sess_uname";
应该使用正确的连接方式,如:
$dir= "user" . "/" . $sess_uname;
4)对于上面的所有工作,这也是不正确的。要么使用$_SERVER['DOCUMENT_ROOT']
来构建从你的网站的根开始的绝对路径,要么使用相对路径,下面写的行是你得到Warning: Division by zero
的原因:
unlink($dir/$row1['filename']);
应该是:
unlink($dir . "/" . $row1['filename']);
但这是只有如果$row1
是工作的,这在目前显然不是。
改变这一行
unlink($dir/$row1['filename']);
unlink($dir.'/'.$row1['filename']);
因为不是提供目录结构,而是将值分割。
终于找到了解决方案,问题出在SQL语法上。之前是这样的:
$sql="DELETE FROM photos WHERE id=':id' LIMIT 1";
$sql1 = "SELECT * FROM photos WHERE user=':session' LIMIT 30";
我去掉了id的单引号,因为它是一个整数,现在它像魅力一样工作。现在我的代码看起来像这样:
$sql="DELETE FROM photos WHERE id=:id LIMIT 1";
$sql1 = "SELECT * FROM photos WHERE id=:id LIMIT 1";