Sphinx — Как избежать пользовательского ввода для SphinxQL?

У меня есть веб-сайт, где пользователи могут искать сообщения, вводя ключевые слова,
Я использую поиск 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."') ";
?>

Как я могу избежать пользовательского ввода и убедиться, что запрос не будет тормозить и вернуть набор результатов?

0

Решение

Вы должен используйте экранирование 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. Это означает, что никакие операторы не будут работать, потому что они будут полностью экранированы.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]