2015-03-19 2 views
1

Я пытаюсь сделать простой поиск по нескольким словам с помощью команды RLIKE MySQL, но когда вы вставляете в ключевые слова такие как ") ($ *" Я получаю исключение PDO и ошибку MySQL , например, вставляя «(» я получаю:MySQL RLIKE специальные символы escaping PHP

SQL error: SQLSTATE[42000]: Syntax error or access violation: 1139 Got error 'parentheses not balanced' from regexp

и запрос очень прост:.

SELECT * FROM users WHERE users.name RLIKE :q ORDER BY users.name LIMIT 0, 20; 

Где :q является PDO парами для поиска ключевого слова Exists в PHP функции или PDO метод для этого вида сдерживания? Или если это не так?

ответ

1

Эти символы имеют специальное значение в регулярных выражений шаблон, чтобы написать их как буквенные символы, которые Вы должны избежать их: \(, \), \$ или поместить их в классе символов: [)], [(], [$]

См учебник по регулярному выражению, чтобы знать эти персонажи и их смысл.

Если вы хотите избежать этих специальных символов из сценария php, используйте функцию preg_quote, которая автоматически ускользает от этих символов для вашего параметра. Подробнее см. В руководстве по PHP.

Однако preg_quote предназначен для использования синтаксиса PCRE (механизм регулярных выражений, используемый PHP), который отличается от используемого в MySQL.

+0

Большое спасибо за ответ (извините за последнее время) Я разрешил возврат, используя обычный LIKE, делающий CONCATE из трех текстовых полей и проверяя результат поисковым запросом после основного экранирования «% »и другие символы, которые не разрешены в строках на моем сайте, так что: CONCATE (имя,« фамилия »,« имя пользователя ») LIKE«% test of name% », это не очень приятно видеть, но работает. – RyanJ

Смежные вопросы