doctrine2 dql,在进行类似比较时使用带有%wildcard的setParameter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了doctrine2 dql,在进行类似比较时使用带有%wildcard的setParameter相关的知识,希望对你有一定的参考价值。

我想使用参数占位符 - 例如?1 - 使用%外卡。也就是说,“u.name LIKE%?1%”(虽然这会引发错误)。文档有以下两个例子:1。

// Example - $qb->expr()->like('u.firstname', $qb->expr()->literal('Gui%'))
public function like($x, $y); // Returns ExprComparison instance

我不喜欢这样,因为没有针对代码注入的保护。

2.

// $qb instanceof QueryBuilder

// example8: QueryBuilder port of: "SELECT u FROM User u WHERE u.id = ?1 OR u.nickname LIKE ?2 ORDER BY u.surname DESC" using QueryBuilder helper methods
$qb->select(array('u')) // string 'u' is converted to array internally
   ->from('User', 'u')
   ->where($qb->expr()->orx(
       $qb->expr()->eq('u.id', '?1'),
       $qb->expr()->like('u.nickname', '?2')
   ))
   ->orderBy('u.surname', 'ASC'));

我不喜欢这个,因为我需要在对象的属性中搜索术语 - 也就是说,我需要两侧的外卡。

答案

将参数绑定到查询时,DQL与PDO完全相同(这是Doctrine2在引擎盖下使用的)。

因此,在使用LIKE语句时,PDO会将关键字和%通配符视为单个标记。您无法在占位符旁边添加通配符。绑定参数时,必须将它们附加到字符串。

$qb->expr()->like('u.nickname', '?2')
$qb->getQuery()->setParameter(2, '%' . $value . '%');

请参阅php手册中的comment。希望有所帮助。

另一答案

选择的答案是错误的。它有效,但不安全。

你应该逃避在百分号之间插入的术语:

->setParameter(2, '%'.addcslashes($value, '%_').'%')

LIKE将百分号“%”和符号下划线“_”解释为通配符。如果它们没有正确转义,攻击者可能会构建可能导致拒绝服务攻击的异常复杂的查询。此外,攻击者可能会获得他不应该获得的搜索结果。有关攻击情形的更详细说明,请访问:https://stackoverflow.com/a/7893670/623685

以上是关于doctrine2 dql,在进行类似比较时使用带有%wildcard的setParameter的主要内容,如果未能解决你的问题,请参考以下文章

在 Doctrine2 DQL 查询上进行排序的 CASTING 属性

带有类名的 Doctrine 2 DQL 查询?

Doctrine2 关联持久性

如何在 Doctrine 2 DQL 中使用 DATE()?

Doctrine2:任意连接和单表继承

Doctrine 2 DQL CONCAT 字段和常量字符串