我正在尝试在我的项目中使用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
卡米尔
答案 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';
现在一切都应该有效 并且昏迷后的参数被视为所有查询共有的参数,并且不起作用。它可能是一切,它对结果没有影响 我认为线程可以关闭......