首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL数据库中插入信息数组时出错

问在MySQL数据库中插入信息数组时出错
EN

Stack Overflow用户
提问于 2012-05-18 18:37:43
回答 2查看 425关注 0票数 0

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

我正在使用Ajax调用一个php文件,该文件将使div的新顺序进入DB。信息正在正确传递,只是没有正确地插入。

我收到的错误是:

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

代码是:

代码语言:javascript
复制
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,则得到:

代码语言:javascript
复制
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'
)

这是我第一次尝试这样做。任何帮助都会很好。

提前感谢您的帮助!

EN

回答 2

Stack Overflow用户

发布于 2012-05-18 18:41:01

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

代码语言:javascript
复制
foreach($sql as $query) {
    mysql_query($query);
}
票数 1
EN

Stack Overflow用户

发布于 2012-05-18 19:51:21

听起来好像对[]操作符的作用有一些混淆。当要将元素附加到现有数组的末尾时,可以使用[]。

例如:

代码语言:javascript
复制
 $sql = array();
 $sql[] = 'UPDATE table SET order = "0" WHERE id = "2"';
 mysql_query($sql); // this will produce the error you are seeing

相对于:

代码语言:javascript
复制
 $sql = 'UPDATE table SET order = "0" WHERE id = "2"';
 mysql_query($sql); // this will work

您应该这样重写您的代码:

代码语言:javascript
复制
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数据直接传递到数据库。例如,我可以使用如下字符串调用您的脚本:

代码语言:javascript
复制
http://yoursite.com/yourscript.php?listItem=1'%3B%20DROP%20TABLE%20yourtable%3B

由于listItem的值直接传递到数据库--而且$item >= 1检查不够,因为如果字符串以数字数据开头,$item >= 1将计算为整数--我所要做的就是添加一个单引号来终止前面的查询,然后我可以随意插入任何我想要的SQL命令;这是一个基本的SQL注入攻击。每当您编写与数据库有关的代码时,都应该清除可能要到数据库的任何输入。您的代码的最终版本可能如下所示:

代码语言:javascript
复制
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());

  }

}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10658018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档