-1

我已经尝试了此代码的所有不同类型的变体,但无法使其正常工作,有人能指出我正确的方向吗?

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);

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

4

2 回答 2

1

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

于 2013-09-29T21:15:36.660 回答
0

看看这些链接:

Mysqli Prepare Statements + Binding Order BY

正如您找到的 php.net 链接所述,您不能使用绑定变量作为标识符。你需要一个解决方法。mysql_real_escape_char 肯定是一种方式。

... 和 ...

如何将 pdo 的准备好的语句用于 order by 和 limit 子句?

出于这个原因,ORDER BY 字段应该构成传递给prepare()方法的 SQL 字符串的一部分,而不是绑定到之前的查询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);
于 2013-09-29T21:19:20.403 回答