PHP PDO错误与params

时间:2014-09-09 14:43:17

标签: php pdo

我希望管理员可以更新用户的权限,因为管理员还可以添加更多权限,我需要从$ _GET获取行并将其放入查询中;

        if(isset($_GET['flip'], $_GET['userid'],$_GET['newval'])) {
            switch($_GET['newval']) {
               case 1:
                    $upd = $db->prepare("
                        UPDATE premissions
                        SET ? = '1'
                        WHERE userId = ?
                    ");
                    break;
               case 0:
               default:
                     $upd = $db->prepare("
                        UPDATE premissions
                        SET ? = '0'
                        WHERE userId = ?
                    ");
                    break;                       
            }


            $upd->execute(array($_GET['flip'], $_GET['userid']));
        }

但现在我收到此错误消息:

  

致命错误:带有消息的未捕获异常'PDOException'   'SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本正确的语法使用附近'? ='1'在哪里   userId =?'在第2行

我知道语法有问题,但我不知道如何修复它。

2 个答案:

答案 0 :(得分:1)

您无法使用?将列名(或表名)与PDO绑定。 ?用于绑定到赋值右侧的变量。

UPDATE premissions SET ? = '0'

因此不可能。你可以这样做:

if(isset($_GET['flip'], $_GET['userid'],$_GET['newval'])) 
{
  switch($_GET['flip']) 
  {
     case 'column1': $column = 'column1';        break;
     case default  : $column = 'default_column'; break;
  }
  $upd = $db->prepare("UPDATE premissions
                       SET {$column} = ?
                       WHERE userId = ?");
  $upd->execute(array($_GET['newval'], 
                      $_GET['userid']));
}

这里重要的是$column的值永远不会超出指定的值,即'column1''default_column',无论输入是什么。所以你不容易受到SQL注入攻击。我建议检查其他URL参数,如果只是为了防止意外错误。例如,您可以添加:

is_numeric($_GET['userid'])
在接受$_GET['userid']的值之前,

作为测试。

答案 1 :(得分:1)

您只能使用'?'对于值而不是列或表名称。在这种情况下你可以做的是为该表创建一个列数组,然后使用in_array()函数验证列名,然后直接在查询中输入 例如:

$columnNames = array('id', 'username', 'name', 'address', 'zipcode');
if (!in_array($_GET['flip'], $columnNames))
{
    // Not a valid column don't bother preparing a statement
}
else
{
    $column = $_GET['flip'];
    $upd = $db->prepare("
                    UPDATE premissions
                    SET {$column} = '1'
                    WHERE userId = ?
}