【问题标题】:Going from javascript to php to delete multiple rows of MySQL using $_GET with a list of IDs从 javascript 到 php 使用带有 ID 列表的 $_GET 删除多行 MySQL
【发布时间】:2012-07-27 01:04:08
【问题描述】:

我在这个上花了几个小时没有运气。我正在尝试删除标有复选框并按下删除按钮的列表元素。每个复选框都有一个与实际 ID 列值相关的 html id 属性。我正在使用 MySQL 语句根据适当的 id 删除行(我可以从 html 中删除元素,但不能从 MySQL 表中删除)

"DELETE FROM todolist WHERE ID IN (".$_GET['id'].")"

示例 id...id="456,444,454"

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:\xampp\htdocs\todo\removeTasks.php 中的 q 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“0”附近使用正确的语法。如何进入 if 语句然后说它是未定义的?

如果我使用

"DELETE FROM todolist WHERE ID IN ("+$_GET['id']+")"

我收到错误通知:未定义变量:第 13 行 C:\xampp\htdocs\todo\removeTasks.php 中的 q 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的“457”附近使用的正确语法。

457 是第一个 ID。

这里和 mysql 都是新的,所以如果我遗漏了什么,请告诉我。

【问题讨论】:

  • "使用 $_GET 删除 ..." NOOOOOOOOOOO!!!!!!!!!!
  • 是的,我知道...它不用于任何公共用途,请放心;只是想完成这件事。
  • 也使用未转义的 $_GET 删除。
  • 大声笑,我知道我知道;黑客会抓住我的。这是一个夏季网页设计入门课程,我们几乎没有开始 AJAX。而且,我只使用 JEE 为另一个课程开发了一个 Web 应用程序。所以,我所做的一切都是第一次。

标签: php mysql


【解决方案1】:

您收到通知,因为您的变量“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 injections 了解更多信息。

祝你好运

【讨论】:

  • 是的,只需将其设为等号即可;加号是使用和数组和东西留下的。感谢您的第二眼,并获得了最后的改变。
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 2013-03-08
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2019-08-24
  • 1970-01-01
相关资源
最近更新 更多