2011-11-04 90 views
1

我想創建一個搜索功能,用戶可以在文本字段中輸入兩個單詞,它將分割單詞並構建MySQL查詢。使用多個字的PHP搜索

這是我到目前爲止。

$search  = mysql_real_escape_string($_POST['text_field']); 
$search  = explode(" ", $search); 

foreach($search as $word) 
{ 
    $where = ""; 
    $where  .= "product_code LIKE '%". $word ."%'"; 
    $where  .= "OR description LIKE '%". $word ."%'"; 

    $query  = "SELECT * FROM customers WHERE $where"; 
    $result  = mysql_query($query) or die(); 

    if(mysql_num_rows($result)) 
    { 
     while($row = mysql_fetch_assoc($result)) 
     { 
      $customer['value'] = $row['id']; 
      $customer['label'] = "{$row['id']}, {$row['name']} {$row['age']}"; 
      $matches[]   = $customer; 
     } 
    } 
    else 
    { 
     $customer['value'] = ""; 
     $customer['label'] = "No matches found."; 
     $matches[]   = $customer; 
    } 
} 

$matches = array_slice($matches, 0, 5); //return only 5 results 

它構造並運行查詢,但返回有趣的結果。

任何幫助,將不勝感激。

+1

請解釋什麼有趣的結果 –

+0

任何你不能使用全文索引的原因嗎?使用'like'%...%''排除索引的使用,並且性能在大型桌面上會很糟糕。什麼是「有趣的結果」?他們讓你發笑嗎?同樣,你應該逃避單個單詞,而不是字符串在你操縱它之前 –

回答

1
  1. MySQL有一些東西叫LIMIT,所以你最後一行將是不必要的。

  2. 使用全文搜索功能查找此:http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html - 它的速度更快,更優雅

+1

他的最後一行依然有效,因爲如果他總共有10條查詢結果,他只想顯示其中的5條。 LIMIT限制每個查詢的結果。當然,選擇前5場比賽也不是很好的結果,但只是一個澄清。 –

0

如果你的數據庫是MyISAM表的格式,你可以做你感興趣Sn0opy的列的全文搜索已經提到

我個人認爲,當涉及到MySQL,如果你真的想創造一個偉大的搜索引擎使用獅身人面像(http://sphinxsearch.com/)或Solr的(http://lucene.apache.org/solr/

這兩者可能都有學習曲線,但結果很專業。

0

任何比「有趣的結果」更具體的機會?關閉袖口有幾種可能性,但它確實取決於正在返回的結果。我的PHP有點生疏,所以我會前面道歉,如果我的大腦拋出一些java的規則,但在第一次臉紅...

命名數組而非$搜索。這可能不是問題,但用explode()創建的數組帶有要爆炸的字符串的名稱看起來很奇怪。嘗試像$ search = explode(「」,$ search);然後在隨後的foreach()循環中使用$搜索。

如果用戶只輸入一個搜索字詞會怎麼樣?如果$ text_field中沒有空格,那麼爆炸將返回一個空數組,這應該徹底擡起您的查詢。在爆炸$ search之前,您至少應該驗證$ text_field中是否有空格。同樣,如果用戶輸入兩個搜索詞,但是其中一個詞是用空格分隔的兩個詞怎麼辦?同樣,你會得到「有趣的結果」,因爲你會得到你不想要的結果以及重複的結果,因爲查詢將自身擴展到單個詞中的兩個單詞。

不知道更多你的意思是「有趣的結果」這是真的很難麻煩拍這個。