2013-04-07 41 views
0

我玩弄PHPFreaks「簡單的SQL搜索」腳本。我想知道如何在提交查詢後改進搜索方法。簡單的SQL搜索調整

假設我已經提交了一個搜索詞,如「music」,搜索查詢會給我包含術語「music」的數據庫中所有數據的結果,但可以說我想搜索術語「music 「一旦結果顯示出來,我想改進搜索並查找類別爲」rock「或」rap「的音樂下的所有結果。我想用選定的選項列表來做到這一點。

這裏是PHPFreaks工作的腳本,我把它所以這裏的用戶也可以使用這個腳本,如果需要的話:

$error = array(); 
$results = array(); 


if (isset($_GET['search'])) { 
    $searchTerms = trim($_GET['search']); 
    $searchTerms = strip_tags($searchTerms); // remove any html/javascript. 

    if (strlen($searchTerms) < 3) { 
     $error[] = "Search terms must be longer than 3 characters."; 
    }else { 
     $searchTermDB = mysql_real_escape_string($searchTerms); // prevent sql injection. 
    } 

    // If there are no errors, lets get the search going. 
    if (count($error) < 1) { 
     $searchSQL = "SELECT sid, sbody, stitle, sdescription FROM simple_search WHERE "; 

     // grab the search types. 
     $types = array(); 
     $types[] = isset($_GET['body'])?"`sbody` LIKE '%{$searchTermDB}%'":''; 
     $types[] = isset($_GET['title'])?"`stitle` LIKE '%{$searchTermDB}%'":''; 
     $types[] = isset($_GET['desc'])?"`sdescription` LIKE '%{$searchTermDB}%'":''; 

     $types = array_filter($types, "removeEmpty"); // removes any item that was empty (not checked) 

     if (count($types) < 1) 
     $types[] = "`sbody` LIKE '%{$searchTermDB}%'"; // use the body as a default search if none are checked 

      $andOr = isset($_GET['matchall'])?'AND':'OR'; 
     $searchSQL .= implode(" {$andOr} ", $types) . " ORDER BY `stitle`"; // order by title. 

     $searchResult = mysql_query($searchSQL) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$searchSQL}"); 

     if (mysql_num_rows($searchResult) < 1) { 
     $error[] = "The search term provided {$searchTerms} yielded no results."; 
     }else { 
     $results = array(); // the result array 
     $i = 1; 
     while ($row = mysql_fetch_assoc($searchResult)) { 
      $results[] = "{$i}: {$row['stitle']}<br />{$row['sdescription']}<br />{$row['sbody']}<br /><br />"; 
      $i++; 
     } 
     } 
    } 
} 

function removeEmpty($var) { 
    return (!empty($var)); 
} 
?> 

結果:

<?php echo (count($error) > 0)?"The following had errors:<br /><span id=\"error\">" . implode("<br />", $error) . "</span><br /><br />":""; ?> 
     <form method="GET" action="<?php echo $_SERVER['PHP_SELF'];?>" name="searchForm"> 
     Search For: <input type="text" name="search" value="<?php echo isset($searchTerms)?htmlspecialchars($searchTerms):''; ?>" /><br /> 
     Search In:<br /> 
     Body: <input type="checkbox" name="body" value="on" <?php echo isset($_GET['body'])?"checked":''; ?> /> | 
     Title: <input type="checkbox" name="title" value="on" <?php echo isset($_GET['title'])?"checked":''; ?> /> | 
     Description: <input type="checkbox" name="desc" value="on" <?php echo isset($_GET['desc'])?"checked":''; ?> /><br /> 
       Match All Selected Fields? <input type="checkbox" name="matchall" value="on" <?php echo isset($_GET['matchall'])?"checked":''; ?><br /><br /> 
     <input type="submit" name="submit" value="Search!" /> 
     </form> 
     <?php echo (count($results) > 0)?"Your search term: {$searchTerms} returned:<br /><br />" . implode("", $results):""; ?> 

我希望有人能帶領我在這裏正確的方向。我對PHP/MySQL有點熟悉,並且到處都在線上看,但無法找到一種方法來使用此腳本來優化搜索結果。謝謝。

回答

0

您有兩種選擇來優化搜索結果。

  1. 保存/串行化搜索(生成的行集)磁盤/會話,這樣你就可以搜索的情況下,用戶添加任何東西到搜索PARAMS。在這個szenario中,你需要確保用戶沒有改變「base」搜索參數。如果他這樣做了,你可能會首先運行另一個基本搜索,然後從結果中提取精確的結果(類型特定的條目)。

  2. 將新的搜索參數添加到某個base-query-string中,並讓數據庫執行精確搜索。

在這兩種情況下,最終都會得到一個精確的結果。我會去第二個選項,其中你不需要關心以前的搜索參數。您只需將您的「流派」添加到查詢中即可完成。