2016-07-13 65 views
0

我有一個搜索框,其中用戶可以給input.This輸入文本將在數據庫中進行搜索和結果通過語法檢索..如何使PHP搜索類似的話

$sql = "SELECT * FROM new WHERE FNAME LIKE '%$a%' LIMIT 0, 30 "; 
$result = $conn->query($sql); 
if ($result->num_rows > 0) 
{ 
    while($row = $result->fetch_assoc()) 
    { 
     { 
     echo '<tr>'; 
     echo $row["FNAME"]; 
     echo '<br>'; 
     echo '</tr>'; 
     } 
    } 
} 

其工作,但我的問題是我想搜索類似的單詞。 例如,如果有人搜索埃姆蘭和我的數據庫必須得給伊姆蘭.....

+0

這是解決一個非常複雜的問題。只有一個簡單的SQL查詢沒有簡單的方法。您將不得不建立某種搜索索引,使您可以檢索與給定術語相似的術語,然後查找與其關聯的條目。找到「相似」的術語可以從「交換幾個字母並查看它是否匹配」到通過文字挖掘和機器學習評分函數。 ;)這顯然不符合SO的格式。 –

回答

0

由於您正在搜索用戶的具體名稱則沒有這種直接的方法,這將給你的用戶進行任何拼寫錯誤,甚至在搜索時相應的結果。

這就像建立你自己的算法,如果沒有找到它將首先尋找直接匹配,然後它會尋找檢測相似的名稱並返回結果。

其他選項我想創造另一列將存儲在打字原來的名字,你的情況,列FNAME將包含伊姆蘭和FNAME_SEARCH(任何名義按要求)將包含常見的錯誤都是常見的拼寫錯誤發生像emraan,奧姆蘭等製成

所以您查詢將這個樣子,

$sql = "SELECT * FROM new WHERE FNAME LIKE '%$a%' OR FNAME_SEARCH LIKE '%$a%' LIMIT 0, 30 "; 
+0

雅先生那個想法進入了我的想法..但問題是我有很多fieds和很多行的數目已被插入....不僅名稱我必須接受其他領域的搜索也.....大約我必須做至少4000重複。 –

0

只要改變where子句

where soundex(FNAME) = soundex('$a') 

where FNAME sounds like '$a' 
+0

沒有它不工作....我必須改變數據庫字段嗎? –

0

您可能要構建查詢取決於作爲搜索字符串傳遞的第一個字符。如果第一個字符是元音(a,e,o,i,u),則可以運行一個函數來構建使用這些元音的所有可能的組合。這是什麼意思:

<?php 
     $searchTerm  = 'emran'; 
     $probableTerms = buildProbableSearchTerms($searchTerm); 

     $sql = "SELECT * FROM new WHERE FNAME LIKE '{$probableTerms}' LIMIT 0, 30 "; 
     $result = $conn->query($sql); 
     if ($result->num_rows > 0) 
     { 
      while($row = $result->fetch_assoc()) 
      { 
       { 
        echo '<tr>'; 
        echo $row["FNAME"]; 
        echo '<br>'; 
        echo '</tr>'; 
       } 
      } 
     } 

     function buildProbableSearchTerms($searchTerm){ 
      $searchTerms = ""; 
      if(strlen($searchTerm)<1){ 
       return ""; 
      } 
      $arrVowels = array("a", "e", "i", "o", "u"); 
      $arrSString = str_split($searchTerm); 
      if(in_array(strtolower($arrSString[0]), $arrVowels)){ 
       array_splice($arrSString, 0, 1); 
       foreach($arrVowels as $vowel){ 
        $searchTerms .= "%{$vowel}" . implode("", $arrSString) . "% OR "; 
       } 
       $searchTerms = rtrim($searchTerms, " OR "); 
      }else{ 
       $searchTerms .= "%{$searchTerm}%"; 
      } 
      return $searchTerms; 

     } 



     var_dump($probableTerms); 
     // DISPLAYS: '%amran% OR %emran% OR %imran% OR %omran% OR %umran%' 
+0

這實際上並不是我需要的.. –