0

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

我正在使用 Ajax 调用一个 php 文件,该文件会将 div 的新顺序插入到数据库中。信息被正确传递,只是没有被正确插入。

我收到的错误是:
您的 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'
)

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

预先感谢您的帮助!

4

2 回答 2

1

Inmysql_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 列表项之后,添加以下内容:

foreach($sql as $query) {
    mysql_query($query);
}
于 2012-05-18T18:41:01.450 回答
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());

  }

}

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

于 2012-05-18T19:51:21.440 回答