首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >转义SphinxSE中的特殊字符

转义SphinxSE中的特殊字符
EN

Stack Overflow用户
提问于 2011-08-24 11:06:32
回答 1查看 3.1K关注 0票数 4

我正在使用sphinx存储引擎实现在我的网站上进行搜索,它工作得相当好,但是当搜索包含诸如&和@之类的字符时,搜索将失败,并显示以下错误:

代码语言:javascript
运行
复制
There was a problem processing the query on the foreign data source. Data source error: search query already specified

php抛出这个错误:

代码语言:javascript
运行
复制
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中运行它,我不会得到任何错误。

代码语言:javascript
运行
复制
 query = '@title("cheese & cake");limit=1000filter=type=1;ranker=sph04;mode=extended;sort=extended:@weight desc;'
EN

Stack Overflow用户

发布于 2011-08-24 13:19:05

Sphinxql中的字符转义是一个棘手的主题...我不确定它是否已经完全正式解决了。mysql_real_escape_string不会处理特殊的Sphinx查询字符。

它们确实在sphinxapi.php中提供了转义函数:

代码语言:javascript
运行
复制
function EscapeString ( $string )
{
    $from = array ( '\\', '(',')','|','-','!','@','~','"','&', '/', '^', '$', '=' );
    $to   = array ( '\\\\', '\(','\)','\|','\-','\!','\@','\~','\"', '\&', '\/', '\^', '\$', '\=' );
    return str_replace ( $from, $to, $string );
 }

请注意,这不会专门处理SQL转义字符(例如,没有单引号替换)。实际上,我测试了它,它甚至不只适用于Sphinx字符。

您需要此函数:

代码语言:javascript
运行
复制
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子句放入全文解析器,突然'&‘变成了一个特殊字符。所以,你需要在开头加上额外的反斜杠。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7169992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档