我已经尝试过这些代码的各种变体,无法让它工作,有人能指出我正确的方向吗?
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);
当我回显它们时,变量被正确分配,看起来我的内容似乎被忽略了
答案 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);