无法使用bindValue,Postgresql在Doctrine DBAL中绑定字符串值

时间:2013-11-20 22:33:21

标签: postgresql doctrine quotes dbal doctrine-orm-postgres

我正在尝试在我的项目中使用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

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

Best Regrards
卡米尔

2 个答案:

答案 0 :(得分:2)

你可能会错过昏迷吗?

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

(顺便说一下,你应该真的使用模拟的预处理语句来做这样的事情。通过不这样做,顺序by / limit子句基本上保证你最终会得到seq扫描。)

答案 1 :(得分:1)

好的,我想出来了。

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

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

现在一切都应该有效 并且昏迷后的参数被视为所有查询共有的参数,并且不起作用。它可能是一切,它对结果没有影响 我认为线程可以关闭......