首页 >后端开发 >php教程 >为什么我的SQL语句的ORDER BY子句中不能使用PDO参数?

为什么我的SQL语句的ORDER BY子句中不能使用PDO参数?

DDD
DDD原创
2024-12-27 01:39:09943浏览

Why Can't I Use PDO Parameters in the ORDER BY Clause of My SQL Statement?

PDO 语句中的 ORDER BY 参数

在 SQL 语句的 ORDER BY 子句中使用参数时遇到困难。 :order 和 :direction 参数无法产生任何结果。

问题原因

PDO 参数不能直接在 ORDER BY 子句中使用。它们必须是静态字符串。

解决方案

列名称或排序方向没有 PDO 常量。因此,您必须将这些值直接插入到 SQL 语句中。但是,采取预防措施至关重要:

  1. 对脚本中的每个运算符和标识符进行硬编码。
$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";
  1. 使用白名单助手function:
$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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn