我在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();
:my_param有效,但:order:direction无效。是否没有在内部正确地进行转义?我是否坚持将其直接插入SQL?像这样:
$order = 'columnName';
$direction = 'ASC';

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

是否有一个PDO::PARAM_COLUMN_NAME常量或等效的常量?

谢谢!

最佳答案

是的,您一直无法将其直接插入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";

方向相同。

我写了一个whitelisting helper 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]);

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

关于php - 如何使用准备好的PDO语句设置ORDER BY参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/65235696/

10-12 14:17
查看更多