无法在Doctrine DBAL中使用bindValue绑定字符串值,我正在尝试在我的项目中使用Doctrine DBAL; Postgresql
我试图在我的项目中使用Doctrine DBAL;我的数据库是Postgresql。 这是一个简单的用例,我真的不知道为什么这不起作用。无法在Doctrine DBAL中使用bindValue绑定字符串值,我正在尝试在我的项目中使用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
有人能解释这种现象?我怀疑引用问题...
最佳Regrards
卡米尔
也许你会丢失昏迷?
SELECT * FROM table ORDER BY field, :order LIMIT :amount
(顺便说一句,你真的应该使用类似这样的东西模拟预处理语句。如果不这样做,由/限制条款的顺序基本上保证你最终会与序列扫描所有的地方。)
严,谢谢,我错过了昏迷...... 然后'ALL'应该是空的,一切正常。我会阅读有关顺序扫描,这个话题似乎并不简单(我从来没有这样做过)。 谢谢! – Kamil
嘿,不工作......这是更基本的东西。我正在使用SILEX并尝试使用Doctrine的QueryBuilder而不是以上代码: '$ builder = $ app ['db'] - > createQueryBuilder(); $ builder-> select('*') - > from('news') - > orderBy('created_on',$ builder-> createNamedParameter($ order)) - > setMaxResults(20); $ builder-> execute();'它不工作。 – Kamil
好吧,我明白了这一点。
部分SQL语言不能用作预准备语句中的参数。 所以要使用某种条件,例如用于建立这样的查询:
$sql = 'SELECT * FROM table ORDER BY field ';
if ($order = 'ASC') {
$sql .= 'ASC ';
} else ... {
...
}
$sql .= 'LIMIT :amount';
现在一切都应该工作。
昏迷后的参数被视为所有查询共有的参数,并且不起作用。这可能是一切,它对结果没有影响。
我认为线程可以关闭......
$ stmtement-> bindValue('limit',$ limit,\ PDO :: PARAM_INT); – Tauquir