我正在使用sphinx存储引擎实现在我的网站上搜索,这种方法效果相当不错,但是当搜索包含诸如&和/或和@,搜索失败,出现以下错误:
There was a problem processing the query on the foreign data source. Data source error: search query already specified
和php抛出此错误:
Warning: mysql_query() [function.mysql-query]: Unable to save result set in /home/path/to/file.php on line 100
我用mysql_real_escape_string
有趣的是,如果我复制查询并直接在phpmyadmin中运行它,我就没有错误。
query = '@title("cheese & cake");limit=1000filter=type=1;ranker=sph04;mode=extended;sort=extended:@weight desc;'
答案 0 :(得分:4)
Sphinxql中的字符转义是一个棘手的主题......我不确定它是否完全正式解决。 mysql_real_escape_string不会处理特殊的Sphinx查询字符。
它们确实在sphinxapi.php中提供了一个转义函数:
function EscapeString ( $string )
{
$from = array ( '\\', '(',')','|','-','!','@','~','"','&', '/', '^', '$', '=' );
$to = array ( '\\\\', '\(','\)','\|','\-','\!','\@','\~','\"', '\&', '\/', '\^', '\$', '\=' );
return str_replace ( $from, $to, $string );
}
请注意,这不会专门处理SQL转义字符(例如,没有单引号替换)。实际上,我测试了它,它甚至不适用于Sphinx角色。
您需要此功能:
function EscapeSphinxQL ( $string )
{
$from = array ( '\\', '(',')','|','-','!','@','~','"','&', '/', '^', '$', '=', "'", "\x00", "\n", "\r", "\x1a" );
$to = array ( '\\\\', '\\\(','\\\)','\\\|','\\\-','\\\!','\\\@','\\\~','\\\"', '\\\&', '\\\/', '\\\^', '\\\$', '\\\=', "\\'", "\\x00", "\\n", "\\r", "\\x1a" );
return str_replace ( $from, $to, $string );
}
注意Sphinx特定字符上的额外反斜杠。我认为发生的是他们将整个查询通过一个SQL解析器,它为SQL目的删除了逃避反斜杠的“无关”(即'\&' - >'&')。然后,它将MATCH子句放入全文解析器,然后突然'&'是一个特殊的角色。所以,你需要在开头添加额外的反斜杠。