无法在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
卡米尔

+0

$ stmtement-> bindValue('limit',$ limit,\ PDO :: PARAM_INT); – Tauquir

也许你会丢失昏迷?

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

(顺便说一句,你真的应该使用类似这样的东西模拟预处理语句。如果不这样做,由/限制条款的顺序基本上保证你最终会与序列扫描所有的地方。)

+0

严,谢谢,我错过了昏迷...... 然后'ALL'应该是空的,一切正常。我会阅读有关顺序扫描,这个话题似乎并不简单(我从来没有这样做过)。 谢谢! – Kamil

+0

嘿,不工作......这是更基本的东西。我正在使用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'; 

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