【问题标题】:Bind sort attribute in SELECT Statement在 SELECT 语句中绑定排序属性
【发布时间】:2015-09-12 08:30:33
【问题描述】:

对于带有排序顺序的 SELECT 查询,我准备了以下语句:

$direction = 'DESC';
$project_id = 1;

$query = $this->connection->prepare('SELECT text FROM marker WHERE project_id = :project_id ORDER BY time :direction');
$query->bindValue(':project_id', $project_id, PDO::PARAM_INT);
$query->bindValue(':order', $direction, PDO::PARAM_STR);
$success = $query->execute();

但它失败了。所以我准备了这个声明:

$query = $this->connection->prepare('SELECT text FROM marker WHERE project_id = :project_id ORDER BY time '.$direction.'');
$query->bindValue(':project_id', $project_id, PDO::PARAM_INT);
$success = $query->execute();

而且它有效。

不能绑定一个 ORDER 属性吗? 如何正确绑定 ORDER 属性?

【问题讨论】:

  • 见手册[ORDER BY {col_name | expr | position} [ASC | DESC], ...] 你不能用变量传递方向
  • 但你可以使用CASEthis
  • 我刚刚快速浏览了链接。对于一个简单的方法来说,它看起来相当复杂。如上所述,当我在 SELECT 语句中使用 $direction var 时,它可以工作。但我认为它关于 sql 注入的编码不好。所以我的问题是如何正确地做到这一点?
  • 您可以在 PHP 中使用 IF 语句,但它会复制代码或将变量传递给表达式,该表达式将用于订购我上面提供的链接

标签: php mysql sql


【解决方案1】:

您可以使用case 语句表达您想要的内容。下面是一个比较简单的表达方式:

order by (case when :order = 'DESC' then time end) DESC,
         time ASC

【讨论】:

  • 完美运行,谢谢。我接受这个答案是因为我现在可以绑定 order 属性,并且学习了之前不知道的 case 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2011-01-12
  • 2015-07-24
  • 1970-01-01
相关资源
最近更新 更多