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, не переходя в парсер полнотекстовых запросов)

Другие вопросы по тегам