używam laravel 4 i utworzyły następujące zapytanie:Ucieczka ciąg do użytku w MySQL pełnotekstowego wyszukiwania
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)
);
}
Ta kwerenda działa poprawnie w warunkach normalnego użytkowania, jednak, jeśli użytkownik wprowadzi ciąg takich jak ++
, generowany jest błąd. Patrząc na MySQl docs, są pewne słowa kluczowe, takie jak +
i -
, które mają określone cele. Czy istnieje funkcja, która uniknie tych typów znaków specjalnych z ciągu znaków, aby można go było zastosować w wyszukiwaniu pełnotekstowym, jak wyżej, bez powodowania błędów?
Oto przykład błędu, który jest wyrzucany:
{"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}}
Solutions Próbowałem:
$search = str_ireplace(['+', '-'], ' ', $keyword);
$search = filter_var($keyword, FILTER_SANITIZE_STRING);
$search = DB::connection()->getPdo()->quote($keyword);
Jestem zakładając, będę musiał użyć wyrażenia regularnego. Jakie jest najlepsze podejście?
Będziesz chciał uciec z tego zamiast usunąć. – rmobis
Dobrze, byłoby lepiej. Czy są jakieś funkcje, które nie zawierają znaków specjalnych, takich jak '+' i '-'? – chipit24
Ale jeśli te znaki specjalne są chronione, czy będą przydatne w wyszukiwaniu? – chipit24