簡體   English   中英

PHP、MySQL:進行更好的搜索?

[英]PHP, MySQL: Making a better 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);
        }
    }

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

  1. 將通配符與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);
}

好吧,添加通配符運算符總是有最簡單的方法,所以如果他們輸入“Jam”,那就是

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

編輯:關鍵是它會在 JAMIE 或 JAMES 或 LogJam 或(你明白了)上返回匹配項,這意味着他們不需要記住整個名稱,只需要記住其中的一部分。

對於這種行為,我建議使用全文數據庫作為 solr 或 sphinx。 如果您不能或不想安裝它,則應在代碼中添加 %。 $result = mysql_query("SELECT id FROM users WHERE".$key."LIKE"."\"%{$str}%\"") or die(mysql_error());

你應該試試

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM