MySQL错误,我看不出有什么问题

时间:2009-11-10 19:53:23

标签: php mysql

我正在使用此代码在网络应用上输入更新用户权限:

$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" }

7 个答案:

答案 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)

我看到了两个潜在的问题:

  • 在WHERE之前放置一个空格
  • 你的内幕函数可能会留下一个尾随的逗号,它会抛出查询。 rtrim(implode(...),',')纠正

答案 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
    ...
}