我花了几个小时在这件事上,但运气不好。我正在尝试删除那些用复选框标记并在之后按下删除按钮的列表元素。每个复选框都有一个与实际id列值相关的html-id属性。我使用MySQL语句来删除基于适当id的行(我可以从html中删除元素,但不能从MySQL表中删除)
"DELETE FROM todolist WHERE ID IN (".$_GET['id'].")"
示例id…id="456444454"
javascript遍历并找到复选框的id值,并将它们发送到php文件。这部分很好。从警报中,我可以验证它给出了正确的id。这是按下删除按钮时调用的方法。
function removeCheckedTask(){
var checkBoxes = $('toDoList').getElementsByClassName('box');
var deletedID = new Array(); var indexID =0;
for (var i = 0; i < checkBoxes.length; i++) {
if (checkBoxes[i].checked){
deletedID[indexID]=checkBoxes[i].getAttribute('id');indexID++;
var par = checkBoxes[i].parentNode;
$('toDoList').removeChild(par);
i--;
for(var a=i+1; a<checkBoxes.length; a++){//moves other elements
par = checkBoxes[a].parentNode;
par.style.top = (a*40)+"px";
}
}
}
if(deletedID.length>0){
$('message').innerHTML = "Just a second..."
// Set te random number to add to URL request
nocache = Math.random();
// Pass the login variables like URL variable
var ids = 'id='+deletedID[0];
for(var i=1; i<deletedID.length; i++){
ids+= ',' + deletedID[i];
}
alert('removeTasks.php?'+ids);
http.open('get', 'removeTasks.php?'+ids);
http.onreadystatechange = deleteReply;
http.send(null);
}
function deleteReply() {
if(http.readyState == 4){
var response = http.responseText;
$('message').innerHTML = 'Task removed:'+response;
}
}
resetIDs();//resets ids of list elements, don't worry about it
}
这是我的php代码,没有连接的东西。它使它成为is语句。
if(isset($_GET['id'])){
$q+="DELETE FROM todolist WHERE ID IN (".$_GET['id'].")"; //line 13
mysql_query($q) or die(mysql_error());
echo "tried to delete stuff";
} else {
echo("Bad delete");
}
随着我对$q字符串的更改,响应回声一直在变化,但最近这个简单的版本一直在打印MySQL错误-
注意:第13行C:''examplep''htdocs''todo''removeTasks.php中的未定义变量:q您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获取在第1行"0"附近使用的正确语法。如何进入if语句,然后说它是未定义的?
如果我使用
"DELETE FROM todolist WHERE ID IN ("+$_GET['id']+")"
我得到了错误-注意:第13行C:''examplep''htdocs''todo''removeTasks.php中的未定义变量:q您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获得第1行"457"附近要使用的正确语法。
457是第一个id。
这里和mysql都是新的,所以如果我遗漏了什么,请告诉我。
您会收到通知,因为您的变量"q"没有定义,并且您试图向其中添加一些内容。您会收到一个sql错误,因为"+"在php中表示数字,而在javascript中则不同。因此,您的sql语句可能会被转换为零,这就是为什么您会得到"0"错误的原因。相应的方法是:
$q .= "DELETE...";
此外,我更建议单独调用每个查询,因为这样你就可以返回每个查询的结果(或错误):
$q = null;
$ids = explode(",",$_GET["id"]);
foreach($ids as $id) {
$id = (int)$id; //VERY basic security thing
$q = "DELETE FROM todolist WHERE ID = ".$id;
mysql_query($q) or die(mysql_error());
}
你是在学习php还是在学习实际的应用程序?因为正如前面有人所说,这不是一个好的方法。GET不应该用于任何对数据有永久更改的内容。您应该有一个POST表单和一些隐藏字段来检查请求是否真的来自该表单。您应该使用mysql转义函数,因为任何东西都可以在查询后插入。查找mysql注入以获取更多信息。
祝好运