【问题标题】:SQL ORDER BY variable parameter [duplicate]SQL ORDER BY 可变参数 [重复]
【发布时间】:2014-01-14 04:38:59
【问题描述】:

我找不到如何使用变量作为 ORDER BY 选择器的参数:以下代码不起作用。

$orderBy = 'number';
$q = $instanceBDD->prepare('SELECT * FROM operations ORDER BY :orderBy ASC', 
                           array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$q->execute(array('orderBy' => $orderBy));

$q = $instanceBDD->prepare('SELECT * FROM operations ORDER BY number ASC',
                   array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$q->execute();

有效。

既然我想把这段代码放在一个以$orderBy为参数的函数中,想办法解决这个问题真的很方便……

【问题讨论】:

  • 您可以创建一个存储过程,在其中传入您希望排序的列的名称。

标签: php sql sql-order-by


【解决方案1】:

直接放入字符串有什么问题?

$q = $instanceBDD->prepare('SELECT * FROM operations ORDER BY '.$orderBy.' ASC',
    array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

编辑:当然$orderBy 必须转义以避免注入 (PDO::quote())。

【讨论】:

  • 这为 SQL 注入攻击打开了大门
【解决方案2】:

我认为你不能:

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

你可以只使用变量,比如

$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$order=$orders[$key];
$instanceBDD->prepare("SELECT * FROM operations ORDER BY '$order' ASC');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2011-11-20
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多