2011-08-26 33 views
0

我正在一個網站上進行搜索功能,讓用戶搜索mysql數據庫中保存的值。使用php搜索mysql,如何在用戶的搜索字符串中產生(和,或不)功能?

舉例:

該表中有兩種產品。

一個描述值爲「焦炭罐330ml」,另一個「精靈罐330ml」。

現在當搜索這些項目,說一個用戶輸入可以作爲他們的字符串。兩項都顯示,因爲它們都包含can。

如果用戶輸入可樂,可樂就會被退回。

現在想象一下,你已經在數據庫中製造了每一罐汽水,每一種都是作爲一種產品製成的。

像這樣的搜索功能,會有點麻煩。說一個用戶只想要兩個產品,這就是可樂和雪碧罐。

他們將需要尋找像「可口可樂或雪碧並可以和330毫升」

這應該只返回我的例子中使用的兩種產品。

不是我面對的問題是這個。我的搜索功能像我的原始示例一樣運行。我試圖包括某種和,或者不是功能,還沒有完全決定這應該如何工作。

目前,「可樂罐」的搜索將只返回包含可樂和罐頭的結果。但是,如果我搜索「焦炭精靈可以」沒有結果將被返回,因爲沒有結果包含字符串中使用的所有單詞。

下面是該查詢:

$dataQuery = " 
     SELECT * 
     FROM `products` 
     WHERE upper(`desc`) 
     LIKE '%" 
      . implode("%' 
     AND upper(`desc`) 
     LIKE '%", 
      $keywords_array) 
      . "%' 
     ORDER BY `desc`"; 

$keywords_array是從用戶輸入的搜索字符串建立一個數組,驗證後,該代碼如下:

$find = strtoupper($find); 
$find = strip_tags($find); 
$find = trim ($find); 
$_SESSION['find'] = $find; 
$keywords_array = explode(' ', $find); 

$find是字符串由用戶輸入的搜索字符串的後置值設置。

有沒有人有一個好的方法來完成我已經解釋的任何想法?

如果您需要任何額外的代碼,或更好的解釋,請只問!

謝謝!

+1

如果你在MyISAM表上,使用允許自然語言搜索「(可樂或雪碧)+可以」輸入語法的全文索引。 –

回答

1

您正在尋找mysql fulltext search,它的缺省最小字長度爲4個字符,因此如果無法編輯服務器配置,則無法搜索「can」。

此外,它有一個「停用詞」政策,不會對出現在總數據超過50%的字詞提供結果。

+0

嗨,謝謝!這似乎是答案。你能給我一個例子,我應該如何重新格式化我的查詢以利用全文? –

+0

@Black一個簡單的例子:'SELECT * FROM products MATCH(desc)AGAINST(''coke「sprite」「330ml」'BOOLEAN MODE)' –