我遇到了将信息数组插入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'
)
这是我第一次尝试做这样的事情。任何帮助都会很棒。
提前感谢您的帮助!
答案 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());
}
}
还有其他方法可以清理输入数据,这只是其中之一。希望有所帮助。