0

我在 Sphinx PHP API 代码中找到了以下函数:

function sphinxapi_EscapeString($string)
{
    $from = ['\\', '(', ')', '|', '-', '!', '@', '~', '"', '&', '/', '^', '$', '=', '<'];
    $to   = ['\\\\', '\(', '\)', '\|', '\-', '\!', '\@', '\~', '\"', '\&', '\/', '\^', '\$', '\=', '\<'];

    return str_replace($from, $to, $string);
}

但是,它似乎无法正常工作,因为当我在查询中使用带有某些字符的字符串时,Sphinx 会引发异常。

一个例子是引号字符"EscapeString()在它前面放一个反斜杠\,但是 Sphinx 抛出一个异常说:

致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE [42000]:语法错误或访问冲突:1064 index my_index:语法错误,在..

如果我再添加两个反斜杠,使其成为\\\",则不会引发错误。

这是怎么回事?为什么不EscapeString()工作?

4

1 回答 1

1

你还没有分享你的确切代码,但我想知道你是否只是调用这个函数,也需要按照 SQL 规则进行转义。

EscapeString仅转义查询以转义扩展语法字符。

这就是 API 中所需的全部内容,因为Query/AddQuery函数直接接受查询。

但在 SphinxQL 中,查询字符串位于 SQL 语句中,因此字符串在嵌入语句之前需要“SQL 字符串”转义(无论您是否也像 EscapeString 那样转义)。如果您使用准备好的语句,PDO 可以自动完成,否则使用 PDOquote函数。

(像 SQL 解析器这样的查询没有SELECT ... MATCH('one \" ')转义,因为斜杠被 SQL 解析器“吞下”,而不是通过全文查询解析器)

于 2015-03-23T11:06:03.160 回答