SQL ORDER BY使用预准备语句

时间:2013-09-29 21:12:54

标签: php mysql pdo

我已经尝试过这些代码的各种变体,无法让它工作,有人能指出我正确的方向吗?

if(isset($_GET['s']) And isset($_GET['o'])) {
    if(strip_tags(htmlspecialchars($_GET['s'])) === 's') $sortingby = 'sender';
    if(strip_tags(htmlspecialchars($_GET['s'])) === 't') $sortingby = 'title';
    if(strip_tags(htmlspecialchars($_GET['s'])) === 'd') $sortingby = 'timestamp';
    if(strip_tags(htmlspecialchars($_GET['o'])) === 'a') $orderingby = 'ASC';
    if(strip_tags(htmlspecialchars($_GET['o'])) === 'd') $orderingby = 'DESC';
    echo '<br />';
    echo $sortingby;
    echo $orderingby;
}
$stmt = $pdo->prepare("SELECT * FROM messages WHERE
                                    receiver = :id AND rhide = 0 
                                    ORDER BY :sortingby :orderingby
                                    ");
$stmt->execute(array(
                                ':id'=>$id,
                                ':sortingby'=>$sortingby,
                                ':orderingby'=>$orderingby
                                ));
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);

当我回显它们时,变量被正确分配,看起来我的内容似乎被忽略了

2 个答案:

答案 0 :(得分:1)

只有数据可以与占位符绑定,不能绑定列名或表名。

答案 1 :(得分:0)

看看这些链接:

  

Mysqli Prepare Statements + Binding Order BY

     

当您找到状态的php.net链接时,您无法使用绑定变量   用于标识符。你需要一个解决方法。 mysql_real_escape_char   肯定会是一种方式。

......和......

  

How do I use pdo's prepared statement for order by and limit clauses?

     

因此,ORDER BY字段应构成SQL字符串的一部分   传递到prepare()方法,而不是绑定到   在execute()之前查询。

=============================================== ===========

附录:

由于您已经在“准备”之前有效地验证了列名和“ASC / DESC”子句,因此没有SQL注入的危险。

我只是构建字符串:

$sql = 
  "SELECT * FROM messages WHERE " .
  "receiver = :id AND rhide = 0 " .
  "ORDER BY " . $sortingby . " " . $orderingby;
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);