PHP API Sphinx Функция EscapeString() не работает для SphinxQL?
Я нашел следующую функцию в коде PHP API Sphinx:
function sphinxapi_EscapeString($string)
{
$from = ['\\', '(', ')', '|', '-', '!', '@', '~', '"', '&', '/', '^', '$', '=', '<'];
$to = ['\\\\', '\(', '\)', '\|', '\-', '\!', '\@', '\~', '\"', '\&', '\/', '\^', '\$', '\=', '\<'];
return str_replace($from, $to, $string);
}
Однако, похоже, что он не работает должным образом, потому что когда я использую строки с определенными символами в них в запросах, Sphinx генерирует исключения.
Примером является цитата "
, EscapeString()
ставит обратную косую черту \
перед ним, но Сфинкс выдает исключение, сказав:
Неустранимая ошибка: необработанное исключение "PDOException" с сообщением "SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1064 index my_index: синтаксическая ошибка, неожиданная ошибка $end вблизи ''" в..
Если я добавлю еще две обратные косые черты, делая это \\\"
, то никакой ошибки не выдается.
В чем здесь дело? Почему нет EscapeString()
за работой?
1 ответ
Вы не поделились своим точным кодом, но мне интересно, если вы ПРОСТО вызываете эту функцию, вам также нужно экранировать в соответствии с правилами SQL.
EscapeString
ТОЛЬКО избегает запроса, чтобы избежать символов расширенного синтаксиса.
Вот и все, что требуется в API, так как Query
/ AddQuery
Функция принимает запрос напрямую.
Но в SphinxQL строка запроса находится внутри оператора SQL, поэтому строка должна экранировать строку "SQL String", прежде чем она будет встроена в оператор (независимо от того, выполняете ли вы ТАКЖЕ, как EscapeString). PDO может сделать это автоматически, если вы используете подготовленные заявления, в противном случае используйте PDO quote
функция.
(Запрос как SELECT ... MATCH('one \" ')
не пропускается пропеллером, поскольку косая черта "проглатывается" синтаксическим анализатором SQL, не переходя в парсер полнотекстовых запросов)