sql 查询中有一个任务是使用变量作为值ORDER BY。
我知道列名和表名不能“绑定”。
$sort当将具有硬编码值选项的变量插入查询字符串时,我就构造的安全性征求意见,例如:
if ($_POST['sort'] == "DESC") {
$sort = "`title` DESC" ;
} else {
$sort = "`price`" ;
}
$sql = "SELECT * FROM `table`
WHERE `id` = ?
ORDER BY " . $sort . "
LIMIT ?,?
" ;
$stmt = $pdo->prepare($sql);
$stmt->execute(...
一个更广泛的问题是将部分查询放入变量中的做法有多糟糕(或可接受),如下所示:
if ($_POST['column'] == "1") {
$var_sql_str = " AND `column` = '' " ;
} else {
$var_sql_str = "" ;
}
$sql = "SELECT * FROM `table`
WHERE `id` = ?
" . $var_sql_str . "
ORDER BY " . $sort . "
LIMIT ?,?
" ;
$stmt = $pdo->prepare($sql);
$stmt->execute(...
当然,通过无精打采的列表进行硬过滤是安全的,建议仅在这种情况下使用。
从代码中硬编码的部分组装查询也是预先构建具有未知数量条件的查询的主要方法之一。
为了使答案更完整,当从部分组装查询时,通常使用变量。当然,这些变量也必须通过占位符添加。一个例子可以在这里找到:如何为 PDO 动态创建 WHERE 子句:
一般来说,主要思想是把所有的变量收集到一个数组中,然后传给execute()