Escape-строка для использования в полнотекстовом поиске MySQL
Я использую Laravel 4 и настроил следующий запрос:
if(Input::get('keyword')) {
$keyword = Input::get('keyword');
$search = DB::connection()->getPdo()->quote($keyword);
$query->whereRaw("MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST(? IN BOOLEAN MODE)",
array($search)
);
}
Однако этот запрос работает нормально при обычном использовании, если пользователь вводит строку, такую как++
выдается ошибка. Глядя наMySQl документыЕсть несколько ключевых слов, таких как+
а также-
которые имеют конкретные цели. Есть ли функция, которая исключает эти типы специальных символов из строки, чтобы ее можно было использовать в полнотекстовом поиске, как описано выше, без каких-либо ошибок?
Вот пример ошибки, которая выдается:
{"error":{"type":"Illuminate\\Database\\QueryException","message":"SQLSTATE[42000]: Syntax error or access violation: 1064 syntax error, unexpected '+' (SQL: select * from `resources` where `duplicate` = 0 and MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST('c++' IN BOOLEAN MODE))","file":"\/var\/www\/html\/[...]\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php","line":555}}
Решения, которые я пробовал:
$search = str_ireplace(['+', '-'], ' ', $keyword);
$search = filter_var($keyword, FILTER_SANITIZE_STRING);
$search = DB::connection()->getPdo()->quote($keyword);
Я предполагаю, что мне нужно будет использовать регулярные выражения. Какой лучший подход здесь?