PDO 语句中的 ORDER BY 参数
在 SQL 语句的 ORDER BY 子句中使用参数时遇到困难。 :order 和 :direction 参数无法产生任何结果。
问题原因
PDO 参数不能直接在 ORDER BY 子句中使用。它们必须是静态字符串。
解决方案
列名称或排序方向没有 PDO 常量。因此,您必须将这些值直接插入到 SQL 语句中。但是,采取预防措施至关重要:
$orders = array("name", "price", "qty"); $key = array_search($_GET['sort'], $orders); $order = $orders[$key]; $query = "SELECT * from table WHERE is_live = :is_live ORDER BY $order";
$order = white_list($order, ["name", "price", "qty"], "Invalid field name"); $direction = white_list($direction, ["ASC", "DESC"], "Invalid ORDER BY direction"); $sql = "SELECT field from table WHERE column = ? ORDER BY $order $direction"; $stmt = $db->prepare($sql); $stmt->execute([$is_live]);
说明
白名单功能检查值,如果不正确则引发错误,降低 SQL 风险注射攻击。
示例
$sql = "SELECT field from table WHERE column = :my_param"; $stmt = $db->prepare($sql); $stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR); $stmt->bindParam(':order', $order, PDO::PARAM_STR); $stmt->bindParam(':direction', $direction, PDO::PARAM_STR); $stmt->execute();
以上是为什么我的SQL语句的ORDER BY子句中不能使用PDO参数?的详细内容。更多信息请关注PHP中文网其他相关文章!