30

パラメータプレースホルダー(例:?1)を%ワイルドカードで使用したいと思います。つまり、「u.name LIKE%?1%」のようになります(ただし、これはエラーをスローします)。ドキュメントには次の2つの例があります:1。

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

コードインジェクションに対する保護がないため、これは好きではありません。

2.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 に答える