开发者社区> 问答> 正文

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

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

$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常数或等效项?

谢谢!

展开
收起
保持可爱mmm 2020-05-10 20:41:35 667 0
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]); 这里的想法是检查该值并在不正确的情况下引发错误。来源:stack overflow

    2020-05-10 20:42:03
    赞同 展开评论 打赏
问答分类:
PHP
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载