PDO参数根本不起作用

| 我正在检查一些代码,并更改其中的数据库部分以使用PDO。到目前为止,除了我准备好的语句中的参数之外,其他所有东西都工作正常。由于某种原因,以下代码根本无法工作。这两个$ _GET变量基本上用于特定页面上的排序。查询本身无需使用参数即可正常运行,如果我在末尾手动输入\“ ORDER BY id DESC \”,也可以正常运行。我似乎无法使其与可变参数一起使用。这是代码:
$sort = $_GET[\'sort\'];
$order = $_GET[\'order\'];
$statement = $db->prepare(\'SELECT uid, id, fname, lname, ext, uname
  , email, access, created, modified, last_login, enabled 
  FROM users 
  ORDER BY :col :or\');
$statement->bindParam(\':col\', $sort);
$statement->bindParam(\':or\', $order);
$statement->execute();
$num = $statement->rowCount();
有什么建议么? 谢谢     
已邀请:
当将参数作为参数传递给ѭ1arguments子句时,它们将被视为文字表达式。如果要按列或别名排序,则需要传递一个标识符。在MySQL中,它们用未引号引起来的字符串表示,或者最好用反引号引起来的字符串表示,例如
ORDER BY `fname`
同样,方向常数(如果存在)必须使用两个关键字“ 3”或“ 4”中的任何一个。我不确定如果尝试使用参数(它将作为表达式求值)会发生什么。 这是我过去使用允许的可排序列的映射完成此操作的方式...
$orderCols = array(
    \'firstName\' => \'fname\',
    \'lastName\'  => \'lname\'
);
$sort = isset($_GET[\'sort\'], $orderCols[$_GET[\'sort\']])
    ? $orderCols[$_GET[\'sort\']
    : \'uid\'; // some sane default

$order = isset($_GET[\'order\']) && $_GET[\'order\'] == \'DESC\'
    ? \'DESC\' : \'ASC\';

$query = sprintf(\'SELECT uid, id, fname, lname, ext, uname, email, access, created, modified, last_login, enabled FROM users ORDER BY `%s` %s\',
    $sort, $order);
$statement = $db->prepare($query);
    
使用参数作为伪关键字将无法正常工作! 这是使用参数防止SQL注入攻击的原因(部分)。 当然,由于您可以操纵字符串,因此只需在其中插入\'DESC \'/ \'ASC \',即可重新打开整个SQL注入孔。 因此:col将不被接受为字段。至于$ order我会推荐类似的代码 伪代码(不是真正的php)
if uppercase($order) <> \'DESC\' then $order = \'ASC\';
$query = \'select ... \'+ $order;
显式测试会将所有注入代码转换回\'ASC \',这样可以安全地破解它。 当然,对于该字段,您还可以对所有可能的字段名称进行显式测试。只要您确保可能的结果只能是有效的字段名称,那么您就很好了,但步履蹒跚。 警告 现在,您(有可能)重新处理了查询字符串,您也重新回到了SQL注入领域,因此,请务必谨慎操作。     

要回复问题请先登录注册