30

我想将参数占位符 - 例如 ?1 - 与 % 通配符一起使用。也就是说,类似于:“u.name LIKE %?1%”(尽管这会引发错误)。文档有以下两个例子:1。

// Example - $qb->expr()->like('u.firstname', $qb->expr()->literal('Gui%'))
public function like($x, $y); // Returns Expr\Comparison 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'));

我不喜欢这样,因为我需要在对象的属性中搜索术语——也就是说,我需要两边都有通配符。

4

2 回答 2

76

在将参数绑定到查询时,DQL 的工作方式几乎与 PDO 完全一样(这是 Doctrine2 在后台使用的)。

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

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

请参阅 PHP 手册中的此注释。希望有帮助。

于 2010-09-21T15:42:59.133 回答
11

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

您应该转义在百分号之间插入的术语:

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

百分号“%”和下划线符号“_”被解释为通配符LIKE。如果它们没有正确转义,攻击者可能会构建任意复杂的查询,从而导致拒绝服务攻击。此外,攻击者可能会获得他不应该获得的搜索结果。可以在此处找到攻击场景的更详细描述:https ://stackoverflow.com/a/7893670/623685

于 2017-12-31T10:54:39.423 回答