在mysql布尔匹配中强制“隐含AND”而不是“隐含OR”?

时间:2009-11-27 08:28:13

标签: php mysql

在mysql布尔匹配中,如果不存在运算符,则隐含OR。如果您想要AND,则需要为每个关键字添加+。

因此查询“word1 word2”等于“word1或word2”,“+ word1 + word2”等于“word1 AND word2”

我不希望用户在每个关键字前输入+,我的选择是什么?

建议选项1:my.conf中是否有东西我可以更改为设置默认值(我没有找到任何内容)

建议选项2:解析查询并手动为每个单词添加+。您可以分享任何简单的代码吗?

这个问题是如果用户添加“引号”或运算符(+ - *<>)等,它会破坏我的解析代码。

3 个答案:

答案 0 :(得分:3)

我在我的网站上提出了第二条建议。

如果你只处理单词(不是带引号的字符串),在每个单词之前添加+的简单单行

$q = implode(' ', array_map(create_function('$a', 'return "+".$a;'), preg_split('`\\s+`', $q))))

甚至更简单的正则表达式替换相同:

echo preg_replace('`(\\W|^)\\w`', '\\1+\\2', $q);

如果您不仅有单个单词而且还有引用短语进行搜索,则应在每个单引号和每个引用字符串之前添加+

echo preg_replace('`(\\s|^)(\\w|"[^"]+")`', '\\1+\\2', $q);

答案 1 :(得分:0)

不确定你的意思,但这里有一个例子,说明如何在每个单词前添加+。

$s = "a string with several words in it";
$words = preg_split('/\s+/',$s,null,PREG_SPLIT_NO_EMPTY);
if (count($words)) {
    $str = '+' . implode(' +',$words);
}

答案 2 :(得分:0)

在没有运算符的情况下,没有办法在布尔模式下更改全文匹配的行为,缺少编辑源代码。你必须以某种形式使用选项2(正如其他人所示)。如果搜索表达式来自用户,请注意如何操作。