PHP,MySQL:做出更好的搜索?

时间:2011-05-04 15:05:22

标签: php mysql search

我创建了一个搜索框功能,允许我输入一个单词,然后在我的数据库中找到该单词的任何匹配项。但是,它只找到EXACT匹配。我正在寻找有关如何更好地进行搜索的建议。

以下代码是我目前用于在数据库中搜索可能与用户搜索匹配的用户的代码。

    $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);
        }
    }

4 个答案:

答案 0 :(得分:3)

我看到两点可以改进您的代码片段。但首先要注意$ str的格式是否正确,以便在SQL查询中安全使用。否则,您将遇到名为SQL Injection的问题。我现在假设您的代码。

  1. 将通配符与the LIKE SQL function一起使用。
  2. 使用一个SQL查询搜索三个字段。
  3. 请参阅包含这两个建议的示例代码。首先构建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);
    }
    

答案 1 :(得分:2)

总有最简单的添加通配符运算符的方法,所以如果他们输入'Jam'就会

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

编辑:关键是它会在JAMIE或JAMES或LogJam上返回一个匹配或(你明白了),这意味着他们不需要记住整个名称,只是它的一部分。

答案 2 :(得分:2)

我建议使用全文数据库作为solr或sphinx来处理这种行为。 如果您不能或不想安装它,则应该在代码中添加%。 $ result = mysql_query(“SELECT id FROM users WHERE”。$ key。“LIKE”。“\”%{$ str}%\“”)或死(mysql_error());

答案 3 :(得分:1)

你应该试试

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