2013-06-25 35 views
3

我想基於複選框選擇使用或不使用多個類別進行mysqli全文搜索。MySQLi全文搜索多列類別

搜索基於同一列內的四個類別。

搜索類別是窗口,遊戲,平板電腦,手機。

當通過複選框選擇搜索選擇的類別/多個類別應該只對選定的類別進行。

表結構

id category title    date ... 
1 windows windows7    d1 ... 
2 games  windows games  d2 ... 
3 tablet  windows tablet  d3 ... 
4 mobile  windows mobile  d4 ... 
5 windows windows8    d5 ... 
6 windows windows vista  d6 ... 

複選框搜索是

搜索在

<li><label><input name="all" type="checkbox" checked="checked" />All</label></li> 
    <li><label><input name="windows" type="checkbox" />Windows OS</label></li> 
    <li><label><input name="mobile" type="checkbox" />Windows Mobile</label></li> 
    <li><label><input name="games" type="checkbox" />Windows Games</label></li> 
    <li><label><input name="tablet" type="checkbox" />Windows Tablet</label></li> 

例1:

Search for 'windows' should return result as 

windows7 
windows8 
windows vista 

When only checkbox windows is checked 

例2:

Search for 'windows' should return result as 

windows7 
windows8 
windows vista 
windows games 

When checkbox windows and games are checked.  

我已經提出了一個查詢,但它根本不工作。

$query = "SELECT * FROM $table WHERE "; 
$query .= "category='' "; 
$query .= "OR category='windows' "; 
$query .= "OR category='games' "; 
$query .= "OR category='mobile' "; 
$query .= "OR category='tablet' "; 

$query .= " AND MATCH (title) AGAINST ('+$keyword*' IN BOOLEAN MODE) ORDER by id desc, title desc LIMIT 10"; 

我也試過這樣但不工作。

$query = "SELECT * FROM $table WHERE "; 
$query .= "MATCH (category) AGAINST ('' IN BOOLEAN MODE) "; 
$query .= "OR MATCH (category) AGAINST ('windows' IN BOOLEAN MODE) "; 
$query .= "OR MATCH (category) AGAINST ('games' IN BOOLEAN MODE) "; 
$query .= "OR MATCH (category) AGAINST ('mobile' IN BOOLEAN MODE) "; 
$query .= "OR MATCH (category) AGAINST ('tablet' IN BOOLEAN MODE) "; 

$query .= " AND MATCH (title) AGAINST ('+$keyword*' IN BOOLEAN MODE) ORDER by id desc, title desc LIMIT 10"; 

請看看爲什麼它不起作用,並建議如何搜索查詢可以爲選定的字段。

謝謝。

+0

什麼在所有這些'匹配點領域反對'field1''?對我來說看起來很奇怪 –

+0

@YourCommonSense表格和搜索中的一些列應該僅在標題中根據行進行,如果包含選定的字段。 –

+0

你有錯誤信息嗎?請考慮發佈鏈接到小提琴或一些示例數據和您的表架構。缺乏這些信息的問題很難回答,並經常被低估。我假設field1,field2等是同一個表中的其他字段。如果是這樣,請取消引用它們,查詢應該工作,即field = field1 OR field = field2 OR .... –

回答

2
SELECT * FROM table WHERE MATCH (field1, field2, field3, field4) 
          AGAINST ('keyword' IN BOOLEAN MODE) 

似乎你需要什麼。

但是,您的查詢已廣泛開放給SQL注入。

現在有可能回答。所以,在這裏不用基於safeMysql(如在原材料的mysqli需要太多的代碼)

$sql = "SELECT * FROM ?n WHERE category IN(?a) 
      AND MATCH (title) AGAINST (?s IN BOOLEAN MODE) ORDER by id desc LIMIT 10"; 
$data = $db->($sql,$table,$_GET['category'], $_GET['keyword']); 

注意,您必須打電話給你的複選框領域

<input name="category[]" value="windows" type="checkbox" /> 
+0

您的查詢與關鍵字匹配的字段就好像它們是不同的列一樣,但有一個字段列需要匹配的字段很多,字段只能匹配字段和關鍵字匹配。你能幫助我嗎? –

+0

「字段」和「列」是同義詞。所以,我不知道你在說什麼。匹配一個領域與另一個領域是沒有意義的。 –

+0

在一列中匹配另一列中匹配的特定關鍵字的不同值時,先生很難理解先生。 –