无法将信息数组插入MySQL数据库

时间:2012-05-18 18:37:43

标签: mysql database arrays insert

我遇到了将信息数组插入mysql数据库的问题。基本上我构建了一个类似于Facebook相册的可排序图库,可以通过将div移动到具有jquery可排序功能的新位置来安排。

我正在使用Ajax来调用一个php文件,该文件将把div的新顺序放入DB中。信息正确传递,没有正确插入。

我收到的错误是:
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“Array”附近使用正确的语法

Php代码是:

foreach ($_GET['listItem'] as $position => $item) {
    if ($item >= 1) {
        $sql[] = "UPDATE table SET order = '{$position}' WHERE id = '{$item}'";
        mysql_query($sql) or die(mysql_error());
    }
}

如果删除mysql_query函数并执行print_r,我会得到:

Array
(
    [0] => UPDATE table SET order = '0' WHERE id = '2'
    [1] => UPDATE table SET order = '1' WHERE id = '4'
    [2] => UPDATE table SET order = '2' WHERE id = '3'
    [3] => UPDATE table SET order = '3' WHERE id = '1'
    [4] => UPDATE table SET order = '4' WHERE id = '5'
    [5] => UPDATE table SET order = '5' WHERE id = '6'
)

这是我第一次尝试做这样的事情。任何帮助都会很棒。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

mysql_query($sql) $sql中是一个数组,因此它的值只是Array。当您指定$sql[] = "UPDATE table SET order = '{$position}' WHERE id = '{$item}'";时,只需创建此行$sql = "UPDATE table SET order = '{$position}' WHERE id = '{$item}'";即可。这应该可以解决你的问题。

编辑:

您可以离开[],只需从mysql_query移除foreach($sql as $query) { mysql_query($query); } 即可。在你的foreach列表项之后,添加:

{{1}}

答案 1 :(得分:0)

听起来对于[]运算符的作用存在一些混淆。如果要将元素附加到现有数组的末尾,请使用[]。

例如:

 $sql = array();
 $sql[] = 'UPDATE table SET order = "0" WHERE id = "2"';
 mysql_query($sql); // this will produce the error you are seeing

对战:

 $sql = 'UPDATE table SET order = "0" WHERE id = "2"';
 mysql_query($sql); // this will work

你应该重写你的代码:

foreach ($_GET['listItem'] as $position => $item) {
  if ($item >= 1) {
    $sql = "UPDATE table SET order = '{$position}' WHERE id = '{$item}'";
    mysql_query($sql) or die(mysql_error());
  }
}

这将做你想要的。但是,这仍然不是一个好主意,因为您将不受信任的$ _GET数据直接传递给数据库。例如,我可以使用以下字符串调用脚本:

http://yoursite.com/yourscript.php?listItem=1'%3B%20DROP%20TABLE%20yourtable%3B

由于listItem的值直接进入数据库 - 并且$item >= 1检查不充分,因为如果字符串以数字数据开头,PHP会将字符串计算为整数 - 所有我要做的是添加单引号来终止上一个查询,然后我可以自由地注入我想要的任何SQL命令;这是一个基本的SQL注入攻击。无论何时编写数据库触摸代码,都应该清除可能进入数据库的任何输入。代码的最终版本可能如下所示:

foreach ($_GET['listItem'] as $position => $item) {

  if ($item >= 1) { // this check may or may not be needed depending on its purpose

    $sql = 'UPDATE table SET order = "' . mysql_real_escape_string($position) . '" WHERE id = "' . mysql_real_escape_string($item) . '"';
    mysql_query($sql) or die(mysql_error());

  }

}

还有其他方法可以清理输入数据,这只是其中之一。希望有所帮助。