2009-11-27 48 views
0

在mysql布爾匹配中,如果沒有運算符存在,則暗示OR。如果你想要AND,你需要爲每個關鍵字加上+。在mysql布爾匹配中強制「隱含AND」而不是「隱含OR」?

所以查詢「字詞1字詞2」等於「字詞1或字詞2」,「+字1 +單詞2」等於「字詞1和字詞2」

我不希望用戶在每次前輸入+關鍵字,我有什麼選擇?

建議選擇1:有什麼是在my.conf我可以改變設置的默認值(我沒有找到任何東西)

建議選擇2:解析查詢和手動添加+每一個字。任何簡單的代碼,你可以分享?

這個問題是,如果用戶添加「引號」或運算符(+ - * <>)等它打破我的解析代碼。

回答

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); 
+0

單線內爆電話+1! – 2009-11-27 08:43:03

+0

謝謝,但這是我想到的第一件事,有點矯枉過正,第二種形式只有一個preg_replace電話好得多 – 2009-11-27 08:47:51

+0

我同意,但我有點喜歡第一個更好的概念。 – 2009-11-27 08:53:18

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); 
} 
0

在沒有操作符的情況下,沒有辦法改變布爾模式中全文匹配的行爲,但是沒有編輯源文件。您必須以某種形式或其他形式使用選項2(如其他人所示)。如果搜索表達式來自用戶,請小心如何操作。