У меня есть веб-сайт, где пользователи могут искать сообщения, вводя ключевые слова,
Я использую поиск Sphinx для полнотекстового поиска, все работает как положено.
Но когда я ввожу / вводю некоторые специальные символы в поисковом запросе, поиск не завершается и выдает ошибку.
например
ключевое слово, которое я ищу:
hello)
мой запрос для sphinxql:
SELECT id FROM index1 WHERE MATCH('hello)')
ошибка, которую я получаю:
index index1: syntax error, unexpected ')' near ')'
мой php код выглядит так
<?php
$sphinxql = mysqli_connect($sphinxql_host.':'.$sphinxql_port,'','') or die('ERROR');
$q = urldecode($_GET['q']);
$sphinxql_query = "SELECT id FROM $sphinx_index WHERE MATCH('".$q."') ";
?>
Как я могу избежать пользовательского ввода и убедиться, что запрос не будет тормозить и вернуть набор результатов?
Вы должен используйте экранирование SQL, чтобы избежать внедрения SQL.
http://php.net/manual/en/mysqli.real-escape-string.php
$sphinxql_query = ".... MATCH('".mysqli_real_escape_string($sphinxql,$q)."') ";
… Но ты может ТАКЖЕ хочу, избежать расширенного синтаксиса.
Посмотрите ПЕРВЫЕ ТРИ ПОЗИЦИИ (после этого они углубляются в недопонимание) в этой теме на форуме sphinx
http://sphinxsearch.com/forum/view.html?id=13619
Для простого решения.
Функция в этой теме может быть использована для того, чтобы ваш запрос работал. Это ускользнет от) и перестанет восприниматься как оператор.
НО, это также означает, что вы не сможете использовать любой операторы поиска — потому что это вслепую ускользает от них ВСЕ. (что путаница позже в теме)
Если вы хотите иметь возможность использовать некоторые или все операторы, необходимо использовать более сложное экранирование. (для которого у меня нет хорошего решения)
Редактировать: Actully отпускает всю свинью …
<?php
//Escapes all the Extended syntax, so can accept anything the user throws at us.
function EscapeString ( $string ) {
$from = array ( '\\', '(',')','|','-','!','@','~','"','&', '/', '^', '$', '=' );
$to = array ( '\\\\', '\(','\)','\|','\-','\!','\@','\~','\"', '\&', '\/', '\^', '\$', '\=' );
return str_replace ( $from, $to, $string );
}
if ($allow_full_extended_syntax) {
$q = $_GET['q'];
// the user is responsible for providing valid query.
} elseif ($allow_partical_extended_syntax) {
$q = InteligentEscape($_GET['q']);
//I don't have this function, it would need to be created.
} else {
$q = EscapeString($_GET['q']);
// escapes ALL extended syntax. NO operators allowed
}
$sphinxql_query = ".... MATCH('".mysqli_real_escape_string($sphinxql,$q)."') ";
Тогда это звучит так, как будто вы хотите, чтобы $ allow_full_extended_syntax и $ allow_partical_extended_syntax были установлены в false. Это означает, что никакие операторы не будут работать, потому что они будут полностью экранированы.
Других решений пока нет …