2013-12-10 83 views
0

我有查詢我想出了一個搜索欄。我知道我可以使用或分裂語句來檢查不同的列:MYSQL PHP一次檢查更多一列的聲明

$query = mysql_query('SELECT * FROM PRODUCTS WHERE cats LIKE "%'.$s.'%" OR sub_cats LIKE "%'.$s.'%"'); 

但如果我要檢查超過2個或三列是重新的方式做這樣的事情,加快了一點東西:

$query_string = explode('&&=',$_GET['q']); 
    $db_str = 'SELECT * FROM products WHERE name, cats, sub_cats, desc, brand '; 
    for($x = 0; $x < count($query_string); $x++){ 
     $enc = mysql_real_escape_string($query_string[$x]); 
     if($x == (count($query_string) -1)){ 
      $db_str .= 'LIKE "%'.$enc.'%"'; 
     }else{ 
      $db_str .= 'LIKE "%'.$enc.'%" '; 
     } 
    } 
    $query = mysql_query($db_str); 

我通常在搜索欄中使用POST,但我喜歡給GET一個去看起來更加用戶友好。

+2

您很可能需要[FULLTEXT](http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html)搜索。 –

+2

讓我們現在一起說......'不要使用mysql;它已被棄用。切換到MYSQLI或PDO. – Sablefoste

+1

@Sable Foste你的意思是不推薦使用Mysql,使用PostgreSQL? –

回答

0

您的代碼無法正常工作,即使ignoring the deprecated API。你需要做這樣的事情:

$searchFields = ['name', 'cats', 'sub_cats', 'desc', 'brand']; 
$searchTerm = mysql_real_escape_string($query_string[$x]); 
$filters = implode(' OR ', array_map(function($field) use ($searchTerm) { 
    return "$field LIKE '%{$searchTerm}%'"; 
}, $searchFields)); 
$query = mysql_query('SELECT * FROM products WHERE '.$filters); 

這是遠不夠理想,雖然,很快就會變得遲鈍數據庫和用戶羣增長。不過,究竟是如何phpMyAdmin實現其數據庫範圍的搜索。如果您的數據庫大於幾條記錄,或者可能同時吸引多個搜索,則應該實施更智能的解決方案,如full text search或實施外部搜索引擎,如Apache SOLR,Amazon CloudSearch等 - 關係數據庫,如MySQL他們自己不善於亂糟糟的搜尋,也不是他們曾經想過的。

至於這句話:

我通常使用的搜索工具欄後,但我看中給人得到一個去它 看起來友好給我更多的用戶。

這並不是真正的選擇。通常情況下:

  • GET是針對可重複的請求,即用戶可以按自己的意願設置F5。
  • POST適用於不可重複的請求,如果(過度)重複,POST通常被認爲是有害的。

如果您的名字是谷歌,並且您在世界各地有一臺gazillion服務器,請使用GET。如果你已經知道你的搜索性能不好,堅持POST並且不要誘惑獅子。

+0

dremweaver發現$ searchFields = ['name','cats','sub_cats','desc','brand'];然而,瀏覽器不,這是否重要 –

+0

你不應該在Dreamweaver中編寫代碼,得到像[PhpStorm](http://www.jetbrains.com/phpstorm/)這樣的好的PHP IDE。由於它是一個專用且受到良好支持的PHP IDE,它實際上可以理解[short array syntax](http://php.net/manual/en/migration54.new-features.php),這是近2年前在2012年3月推出的一項功能與PHP 5.4。我真的很驚訝,它只是抱怨,而不是PHP 5.3中引入的匿名函數。 –

0

我不知道這是否會加快速度(你將不得不測試你的數據)。但是,以下是隻有一個比較替代:

WHERE concat_ws('|', name, cats, sub_cats, desc, brand) LIKE '%$enc%' 

因爲你like在開頭通配符,查詢不使用常規的索引。因此,如果有的話,這個版本不應該減慢太多。

儘管您的性能問題的答案可能是全文索引。

+0

我非常懷疑它會加快速度 - 你仍然會導致表掃描,並且每行的字符串搜索量完全相同。如果速度更快,則不會有太大的區別,並且可能每天每小時都有所不同。 –