doctrine2 dql, используйте setParameter с % wildcard при выполнении подобного сравнения


Я хочу использовать параметр place holder-например ?1-с % диких карт. то есть что-то вроде: u.name как %?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'));

Мне это не нравится, потому что мне нужно искать термины в свойствах объекта - то есть мне нужны дикие карты с обеих сторон.

2   25   2010-09-21 01:38:00

2 ответа:

При привязке параметров к запросам DQL в значительной степени работает точно так же, как PDO (что и использует Doctrine2 под капотом).

Поэтому при использовании оператора LIKE PDO обрабатывает как ключевое слово, так и подстановочные знаки % как один маркер. Вы не можете добавить подстановочные знаки рядом с заполнителем. Вы должны присоединить их к строке, когда связываете парамы.

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

Смотрите этот комментарий в руководстве по PHP. Надеюсь, это поможет.

Выбранный ответневерен . Это работает, но не является безопасным.

Следует избегать термина, который вы вставляете между знаками процента:

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

Знак процента " % "и символ подчеркивания" _ " интерпретируются как подстановочные знаки LIKE. Если они не будут экранированы должным образом, злоумышленник может построить арбир-тально сложные запросы, которые могут вызвать атаку типа "отказ в обслуживании". Кроме того, злоумышленник может получить результаты поиска, которых у него нет. должен был попасть. Более подробное описание сценариев атаки можно найти здесь: https://stackoverflow.com/a/7893670/623685