我正在使用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;'
发布于 2011-08-24 13:19:05
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子句放入全文解析器,突然'&‘变成了一个特殊字符。所以,你需要在开头加上额外的反斜杠。
https://stackoverflow.com/questions/7169992
复制相似问题