我正在使用此代码在网络应用上输入更新用户权限:
$updaters = array();
for ($i = 1; $i <= 24; $i++){
if (isset($_POST['permsA['.$i.']']))
$updaters[] = '`'.$i.'` = \''.mysqli_real_escape_string($db, $_POST['permsA['.$i.']']).'\'';
}
$insert = mysqli_query($db,'UPDATE `tbl_perms` SET '.implode(',', $updaters). 'WHERE `userid` = '.$id)or die(mysqli_error($db));
我得到的错误来自SQL:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `userid` = 1' at line 1
我似乎无法重写代码来删除错误:(
这是生成permsA的代码
<?
while($i = mysqli_fetch_array($get_perms)){
$pname = $i[pname];
$id = $i[id];
?>
<div><input type="checkbox" tabindex="1" name="permsA[<? echo $id;?>]" value="1" <? if($permissionid[$id] == '1') {echo ' checked="checked" ';}?> /><?echo htmlspecialchars($pname);?></div>
<? } ?>
以下是产生错误的确切查询:
$insert = mysqli_query($db,'UPDATE `tbl_perms` '.$updaters.' WHERE `userid` = '.$id) or die(mysqli_error($db));
这是sql生成的内容:
UPDATE `tbl_perms` SET WHERE `userid` = 1
这是POST var_dump($_POST['permsA'])
之后变量的变量转储:
array(22) { [1]=> string(1) "1" [2]=> string(1) "1" [3]=> string(1) "1" [4]=> string(1) "1" [5]=> string(1) "1" [6]=> string(1) "1" [8]=> string(1) "1" [9]=> string(1) "1" [10]=> string(1) "1" [11]=> string(1) "1" [12]=> string(1) "1" [13]=> string(1) "1" [14]=> string(1) "1" [15]=> string(1) "1" [16]=> string(1) "1" [17]=> string(1) "1" [18]=> string(1) "1" [19]=> string(1) "1" [20]=> string(1) "1" [21]=> string(1) "1" [22]=> string(1) "1" [23]=> string(1) "1" }
答案 0 :(得分:2)
在WHERE子句之前但在撇号' WHERE
答案 1 :(得分:1)
在WHERE
之前添加空格确保$ updaters已满。
试试这个:
$updaters = array();
for ($i = 1; $i <= 24; $i++){
if (isset($_POST['permsA['.$i.']']))
$updaters[] = '`'.$i.'` = \''.mysqli_real_escape_string($db, $_POST['permsA['.$i.']']).'\'';
}
$updaters = (count($updaters) > 0) ? ' Set '.implode (',', $updaters).' ' : '';
$insert = mysqli_query($db,'UPDATE `tbl_perms` '.$updaters.' WHERE `userid` = '.$id)or die(mysqli_error($db));
答案 2 :(得分:1)
我不确定这是否是问题,但WHERE
关键字之前没有空格。
答案 3 :(得分:1)
我看到了两个潜在的问题:
答案 4 :(得分:0)
我猜这个答案已经说过了,但是我会建议你参数化查询,因为它们更安全,并且免除了字符串调试的麻烦。
显然它没有修复。你可以发布执行的整个查询吗?
答案 5 :(得分:0)
如果你宣布你的帖子字段名称是这样的:name =“permsA [$ i]”那么你必须以这种方式访问它:$ _POST ['permsA'] [$ i]。
答案 6 :(得分:0)
引用$ _POST值的方式似乎存在逻辑错误。当name input variables带有方括号后缀(例如“permsA []”,“permsA [3]”)时,PHP会将它们解析为数组。尝试:
for ($i = 1; $i <= 24; $i++){
if (isset($_POST['permsA'][$i])) {
$updaters[] = "`$i`='".mysqli_real_escape_string($db, $_POST['permsA'][$i])."'";
}
}
或者,更好的是,使用PDO并准备好查询:
// keys of $permsAFields are keys we want to allow for input array 'permsA'
static $permsAFields = array_fill(1, 24, 1);
...
// filter permsA
$permsA = array_intersect_key($_POST['permsA'], $permsAFields);
if (count($permsA)) {
$query = $db->prepare("UPDATE `tbl_perms` SET `" . implode('`=?, `', array_keys($permsA)) . "`=? WHERE `userid`=?");
$permsA[]=$id;
$query->execute($permsA);
} else { // invalid input
...
}