2011-05-04 87 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());