2

我正在尝试在我的项目中使用 Doctrine DBAL;我的数据库是 Postgresql。这是一个简单的用例,我真的不知道为什么这不起作用。

$query = "SELECT * FROM table ORDER BY field :order LIMIT :amount";

让我们假设:

$order = 'DESC' and $amount = 'ALL';

上面的代码似乎没问题。

$statement = $app['db']->prepare($sql);
$statement->bindValue('order', $order);
$statement->bindValue('amount', $amount);
$statement->execute();

我收到此错误:

SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1"
LINE 1: SELECT * FROM table ORDER BY field $1 LIMIT $2

有人可以解释这种行为吗?我怀疑引用问题...

最好的问候
卡米尔

4

2 回答 2

2

你可能错过了昏迷吗?

SELECT * FROM table ORDER BY field, :order LIMIT :amount

(顺便说一句,你真的应该为这样的东西使用模拟的准备好的语句。如果不这样做,order by/limit 子句基本上可以保证你最终会在整个地方进行 seq 扫描。)

于 2013-11-20T22:56:02.607 回答
1

好的,我想通了。

SQL 语言的一部分不能用作准备语句中的参数。所以应该使用某种条件来创建这样的查询:

$sql = 'SELECT * FROM table ORDER BY field ';
if ($order = 'ASC') {
  $sql .= 'ASC ';
} else ... {
  ...
}
$sql .= 'LIMIT :amount';

现在一切都应该工作了。
并且逗号后面的参数被当作所有查询共有的参数,没有起作用。它可能是一切,它对结果没有影响。
我认为线程可以关闭...

于 2013-11-21T14:08:54.913 回答