2016-02-01 67 views
3

我目前正在進行實時搜索,直接顯示來自mysql數據庫的結果。php和mysql實時搜索

該代碼的作品,但不是真的如我所願。

讓我們先從一個例子,使其更易於理解:

我的數據庫中有5列:

id, link, description, try, keywords 

運行關鍵了Ajax請求的腳本如下:

$("#searchid").keyup(function() { 
    var searchid = encodeURIComponent($.trim($(this).val())); 
    var dataString = 'search=' + searchid; 
     if (searchid != '') { 
      $.ajax({ 
       type: "POST", 
       url: "results.php", 
       data: dataString, 
       cache: false, 
       success: function (html) { 
       $("#result").html(html).show(); 
       } 
      }); 
     } 
     return false; 
    }); 
}); 
上results.php文件

看起來是這樣的:

if ($db->connect_errno > 0) { 
    die('Unable to connect to database [' . $db->connect_error . ']'); 
} 

if ($_REQUEST) { 
    $q = $_REQUEST['search']; 

    $sql_res = "select link, description, resources, keyword from _db where description like '%$q%' or keyword like '%$q%'"; 
    $result = mysqli_query($db, $sql_res) or die(mysqli_error($db)); 

    if (mysqli_num_rows($result) == 0) { 
     $display = '<div id="explainMessage" class="explainMessage">Sorry, no results found</div>'; 
     echo $display; 
    } else { 
     while ($row = $result->fetch_assoc()) { 
      $link = $row['link']; 
      $description = $row['description']; 
      $keyword = $row['keyword']; 
      $b_description = '<strong>' . $q . '</strong>'; 
      $b_keyword = '<strong>' . $q . '</strong>'; 
      $final_description = str_ireplace($q, $b_description, $description); 
      $final_keyword = str_ireplace($q, $b_keyword, $keyword); 

      $display = '<div class="results" id="dbResults"> 
        <div> 
         <div class="center"><span class="">Description :</span><span class="displayResult">' . $final_description . '</span></div> 
         <div class="right"><span class="">Keyword :</span><span class="displayResult">' . $final_keyword . '</span></div> 
        </div> 
        <hr> 
       </div> 
       </div>'; 
      echo $display; 
     } 

    } 
} 

現在,讓我們說,我此行中我的DB:

id = 1 
link = google.com 
description = it's google 
totry = 0 
keywords: google, test, search 

,如果我在搜索欄中鍵入:

google, test 

我有正確的結果,但如果我鍵入:

test, google 

我沒有結果,顯然順序是錯誤的。 所以基本上,想要達到的東西更像是「標籤」,這樣我就可以搜索正確的關鍵字而不必使用正確的順序。

我可以用我現在的代碼來做嗎(如果是的話,怎麼樣?)或者我需要改變一些東西?

在此先感謝您的任何建議。 PS:我知道這不是從數據庫中讀取數據的最佳方法,因爲它有一些安全問題,我稍後會改變它,因爲這是一個我很久以前寫的舊腳本,我更多有興趣有這個工作正常,我會改變方法後。

回答

1

未經測試的代碼但修改,

$q = $_REQUEST['search']; 

$q_comma = explode(",", $q); 

$where_in_set = ''; 

$count = count($q_comma); 

foreach($q_comma as $q) 
{ 
    $counter++; 
    if($counter == $count) { 
     $where_in_set .= "FIND_IN_SET('$q','keywords')"; 
    }else { 
     $where_in_set .= "FIND_IN_SET('$q','keywords') OR "; 
    } 
} 

$sql_res = "select link, description, resources, keyword from _db where $where_in_set or description like '%$q%'"; 
+0

用這個例子,當我嘗試搜索時,我得到這個消息:'where子句'中的未知列'$ q' – Nick

+0

@Nick現在檢查我的編輯,我用單引號就是問題 –

+0

ok,現在消息是有點不同...如果我輸入「測試」我在'where子句'中獲得未知列'測試' – Nick

0

有2個解決方案,我能想到的:

  1. 使用全文index and search

  2. 您可以在php中將搜索字符串拆分爲單詞,例如使用explode()和serach搜索單詞不在單個serach條件中的單詞。後者可能非常耗費資源,因爲您正在多個領域進行研究。

0

LIKE '%谷歌,測試%' 將匹配ID = 1而不是 '%谷歌,測試%'「%試驗(昏迷之間沒有空間),也不 '%谷歌測試%'(空格分隔符),也不, 谷歌%'。把每個關鍵字作爲單獨的表,或者您可以根據您的需要拆分輸入的關鍵字爲幾個單個關鍵字並使用或操作,如LIKE「谷歌%」 OR LIKE「測試%」

0

不是一個理想的解決方案,而是將你的搜索數據字符串視爲一個元素,你可以讓php把它當作一個用逗號分隔的關鍵字數組(通過使用爆炸)。然後,您將根據發送的關鍵字數量來構建查詢。

例如,使用 「谷歌測試」 您查詢的是:

$sql_res = "select link, description, resources, keyword from _db where (description like '%$q1%' or keyword like '%$q1%') AND (description like '%$q2%' or keyword like '%$q2%')"; 

其中$ Q1和Q2 $的 「谷歌」 和 「測試」。

0

首先如你所說這不是一個好方法這樣做。我認爲你正在寫一個autocompleter。

  1. 分隔符的單詞

「谷歌,測試」 或 「測試中,谷歌」 是一個連接的話。首先,您需要爲用戶定義分隔符。通常它是一個空白''。

當你定義它時,你需要分割單詞。

$words = explode(" ",$q); 
// now you get two words "google," and "test" 

然後,您需要創建一個SQL,爲您提供多重搜索機會。

有在MySQL LIKE IN()?

很多例子現在你得到你的結果。

  • 文本相似度
  • 從分貝選擇所有結果和在一段時間搜索從另一文本的文本。它給了你一個相似點。最好的結果是你的結果。

    Php Similarity Example

    重要信息

    如果你問我的意見BCS這是非常昂貴不使用它這樣的。在html端使用autocompleters。下面是一個example

    +0

    如果我已經將所有內容都存儲到數據庫中,如何使用html autocompleter?我的意思是,你將如何使用autocompleter來處理數據庫中的數據?你有什麼例子嗎? – Nick

    +0

    您可以選擇並將數據作爲json發送到html。你可以編寫一個使用這個json數據的搜索函數。 – hurricane

    2

    正常化您的模式

    關係型數據庫的規則非常簡單(至少前三個)。

    關鍵字:谷歌,測試,搜索

    ...打破了第二條規則。每個關鍵字應該位於相關表格的自己的行中。那麼你可以簡單地寫你的查詢爲....

    SELECT link, description, resources, keyword 
    FROM _db 
    INNER JOIN keywords 
    ON _db.id=keywords.db_id 
    WHERE keyword.value IN (" . atomize($q) . ") 
    

    (其中霧化爆炸的查詢字符串,適用mysqli_escape_paramter(),以每個條目,以避免破壞你的代碼,封閉在單引號每學期並連接的結果)。

    或者,您可以使用MySQL's full text indexing,它可以透明地爲您做到這一點。

    雖然颶風在他/她的回答中提出了一些優點,但他們沒有提到那裏提出的解決方案沒有規模處理大量數據並且沒有任何效率(將字段分解成新表格/使用full文本索引)。

    +0

    我使用我選擇的答案解決了這個問題,但我想我也會試試這個解決方案。謝謝! – Nick