我希望管理员可以更新用户的权限,因为管理员还可以添加更多权限,我需要从$ _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行
我知道语法有问题,但我不知道如何修复它。
答案 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 = ?
}