我在Sphinx代码中找到了以下函数:
function sphinxapi_EscapeString($string)
{
$from = ['\\', '(', ')', '|', '-', '!', '@', '~', '"', '&', '/', '^', '$', '=', '<'];
$to = ['\\\\', '\(', '\)', '\|', '\-', '\!', '\@', '\~', '\"', '\&', '\/', '\^', '\$', '\=', '\<'];
return str_replace($from, $to, $string);
}但是,它似乎不能正常工作,因为当我在查询中使用带有特定字符的字符串时,Sphinx会抛出异常。
一个例子是引号字符"。EscapeString()在它前面放了一个反斜杠\,但是狮身人面像抛出一个异常,上面写着:
致命错误:异常'PDOException‘与消息'SQLSTATE42000:语法错误或访问冲突: 1064索引my_index:语法错误,未预料到的$end在’‘in。
如果我再添加两个反斜杠,使其为\\\",则不会引发错误。
这里怎么回事?为什么EscapeString()不能工作?
发布于 2015-03-23 11:06:03
您没有共享确切的代码,但我想知道您是否只是调用这个函数,是否也需要按照SQL规则进行转义。
EscapeString只转义查询以转义扩展的语法字符。
这就是API中所需要的,因为Query/AddQuery函数直接接受查询。
但在SphinxQL中,查询字符串位于SQL语句中,因此该字符串在嵌入到语句之前需要“string”转义(不管您是否也像EscapeString那样转义)。如果使用准备好的语句,则PDO可以自动执行,否则使用PDO quote函数。
(像SELECT ... MATCH('one \" ')这样的查询不会直接转义,因为斜杠被SQL解析器“吞没”,而不是通过全文查询解析器)
https://stackoverflow.com/questions/29196362
复制相似问题