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'));
Мне это не нравится, потому что мне нужно искать условия в свойствах объекта - то есть мне нужны дикие карты с обеих сторон.
Ответы
Ответ 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/...