如何使用准备好的 PDO 语句设置 ORDER BY 参数?

2022-08-30 11:20:11

我在SQL部分中使用参数时遇到问题。它不会发出任何警告,但不会打印任何内容。ORDER BY

$order = 'columnName';
$direction = 'ASC';

$stmt = $db->prepare("SELECT field from table WHERE column = :my_param ORDER BY :order :direction");
$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中?这样::my_param:order:direction

$order = 'columnName';
$direction = 'ASC';

$stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction");

是否有常量或等效项?PDO::PARAM_COLUMN_NAME

谢谢!


答案 1

是的,您被困在直接将其插入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]);

这里的想法是检查值并在错误的情况下引发错误。


答案 2

我不认为你可以:

  • 在子句中使用占位符order by
  • 绑定列名 :您只能绑定值 -- 或变量,并将其值注入预准备语句中。

推荐