2011-05-04 35 views
1

我製作了一個搜索框功能,可以讓我鍵入一個單詞,然後在我的數據庫中找到該單詞的任何匹配項。但是,它只能找到確切的匹配。我正在尋找如何使搜索更好的建議。PHP,MySQL:進行更好的搜索?

以下代碼是我當前用於搜索數據庫的用戶可能匹配用戶搜索的數據。

$search_keys = array('fname', 'lname', 'email'); 

    foreach ($search_keys as $key) 
    { 
     $result = mysql_query("SELECT id FROM users WHERE " . $key . " LIKE " . "\"{$str}\"") or die(mysql_error()); 

     while ($row = mysql_fetch_array($result)) 
     { 

      // Get the User 
      $tmp_user = new User(); 
      $tmp_user->getUserById($row['id']); 

      // Add User to list of potential candidates 
      array_push($users, $tmp_user); 
     } 
    } 
+1

請記住,使用'LIKE'方法會忽略索引,並根據您的數據子集進行搜索抓取 – Jakub 2011-05-04 15:11:56

+2

不完全正確。如果搜索項完全被包圍,它只會忽略索引,但如果它只以%結尾 - 例如'Jam%',它將使用索引。資料來源:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – 2011-05-04 15:14:25

回答

3

我看到兩個點,在那裏你可以改善你的代碼片段。但首先要注意,$ str的格式正確,可以安全地用於SQL查詢。否則,你會遇到一個叫做SQL Injection的問題。我現在假設你的代碼。

  1. 使用通配符the LIKE SQL function
  2. 使用一個SQL查詢跨三個字段進行搜索。

請參閱包含兩個建議的示例代碼。首先建立SQL查詢。只需要爲所有(三個)字段運行一個查詢,而不是每個字段一個查詢。如果您稍後再擴展搜索,這很有用。

/* build SQL query */ 
$conditions = array(); 
$search_keys = array('fname', 'lname', 'email'); 
foreach ($search_keys as $key) 
{ 
    $conditions[] = "{$key} LIKE \"%{$str}%\""; # Wildcard (%); [] works like array_push() 
} 
$query = sprintf('SELECT id FROM users WHERE (%s)', implode(' OR ', $conditions)); 

/* run SQL query */ 
$result = mysql_query($query) or die(mysql_error()); 
while ($row = mysql_fetch_array($result)) 
{ 
    // Get the User 
    $tmp_user = new User(); 
    $tmp_user->getUserById($row['id']); 

    // Add User to list of potential candidates 
    array_push($users, $tmp_user); 
} 
+0

我認爲你的11行應該是$ result = mysql_query($ query); – daveomcd 2011-05-04 17:56:29

+1

@daveomcd - 固定的,謝謝提及 – hakre 2011-05-04 18:43:56

+0

這是一個很好的開始,我可以修改更廣泛的搜索。感謝框架,這是一個寶石。 – Andy 2017-11-29 19:41:33

2

嘛總是有添加通配符的最簡單的方法,這樣,如果他們進入「果醬」這將是

SELECT id FROM users WHERE fname LIKE '%Jam%' 
etc... 

編輯:問題的關鍵是它會返回傑米或比賽JAMES或LogJam或(你明白了),這意味着他們不需要記住整個名字,只是它的一部分。

+1

但也是最慢的方法,並與數千或記錄,你會看到這個抓取。 – Jakub 2011-05-04 15:11:14

+0

那麼Jakub是什麼更好的方法?這確實很好,但如果有更好的方法,我想探索它。 – daveomcd 2011-05-04 15:13:34

+1

@Jakub那裏沒有任何爭論,但是做這種搜索從來都不是快速的。 – 2011-05-04 15:14:52

2

我會建議使用全文數據庫作爲solr或sphinx這種行爲。 如果你不能或不想安裝它,你應該在你的代碼中添加%。 $ result = mysql_query(「SELECT id FROM users WHERE」。$ key。「LIKE」。「」%{$ str}%\「」)或die(mysql_error());

1

你應該嘗試

$result = mysql_query("SELECT id FROM users WHERE " . $key . " LIKE " . "%" . $str . "%") or die(mysql_error());