Подтвердить что ты не робот

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

Я хочу использовать держатель параметра - например.? 1 - с% wild cards. то есть что-то вроде: "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'));

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Выбранный ответ неправильный. Он работает, но он не безопасный.

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

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

Знак процента '%' и символ подчеркивания '_' интерпретируются как символы подстановки LIKE. Если они не сбежались должным образом, злоумышленник мог бы построить arbirtarily сложные запросы, которые могут вызвать атаку отказа в обслуживании. Кроме того, злоумышленник может получить результаты поиска, которые он не должен получать. Более подробное описание сценариев атаки можно найти здесь: fooobar.com/info/200759/...