2015-09-01 21 views
0

有了這個代碼:Doctrine setParameter()不適用於我的簡單表達式。我收到 '?'

$qb->select('user.id')->from('myVendor\CoreBundle\Entity\Users', 'user'); 
$expr = $qb->expr()->eq('user.email', '?1'); 
$qb->where($expr); 
$qb->setParameter(1, 'testval'); 

我收到:

SELECT e0_.uid AS uid_0 FROM my_table e0_ WHERE e0_.email = ? 

我也試過這樣:

// ... 
$expr = $qb->expr()->eq('user.email', ':test'); 
// ... 
$qb->setParameter('test', 'testval'); 

PHP 5.5 | MSSQL | Doctrine \ Dbal 2.5.1 | Doctrine \ Orm 2.5.0

我在做什麼錯?

回答

1

Doctrine不會替換查詢本身的參數,它使用準備好的語句,這意味着參數被數據庫服務器替換(並轉義)。

這就是爲什麼當您嘗試顯示參數時總會看到參數化(帶問號)查詢的原因。

+0

我理解這些參數將作爲準備好的語句來處理。但是,有沒有辦法將這些值「解析」爲顯示完整生成的SQL的準備語句?在我的項目中這樣的「導出爲SQL」實際上是管理員用戶的一個功能(直到現在用文本重新設置,但我想使用預準備語句)。 –

+0

使用預處理語句時,查詢不會與參數組合在一起,查詢和參數將始終單獨處理(即使在數據庫中)。我擔心沒有辦法得到組裝的查詢,除了自己做(我不建議這樣做,因爲它很難以安全的方式實現) – kormik

+0

我之所以想要使用預準備語句的原因是讓自動屏蔽輸入(針對SQL注入)。但是我注意到我使用'$ qb-> expr() - > literal($ myval)'也會以自己的方式掩蓋輸入。我希望這種掩蔽是足夠安全的。由於澄清,Upvoted您的答案。 –

相關問題