2012-05-18 157 views
0

我已經爲PHP中的搜索頁面編寫了此代碼,並且我想知道一種使搜索結果更加準確的方法。一些搜索字符串將拉起數據庫中的所有內容,因爲它包含該字詞。這是我的代碼PHP搜索頁面問題

<?php include("header.php");?> 
<h3>Rental Search Results</h3> 
<div class="searchbox"> 
<form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 
<label for="usersearch">Search Rentals Now:</label> 
<input type="text" name="usersearch" value="<?php echo $_GET['usersearch']; ?>" /> 
<input type="submit" name="submit" value="Search" /> 
</form> 
</div> 
<br /> 
<br /> 
<?php 

    // This function builds a search query from the search keywords and sort setting 
    function build_query($user_search, $sort) { 
    $search_query = "SELECT * FROM online_rental_db"; 

    // Extract the search keywords into an array 
    $clean_search = str_replace(',', ' ', $user_search); 
    $search_words = explode(' ', $clean_search); 
    $final_search_words = array(); 
    if (count($search_words) > 0) { 
     foreach ($search_words as $word) { 
     if (!empty($word)) { 
      $final_search_words[] = $word; 
     } 
     } 
    } 

    // Generate a WHERE clause using all of the search keywords 
    $where_list = array(); 
    if (count($final_search_words) > 0) { 
     foreach($final_search_words as $word) { 
     $where_list[] = "Description LIKE '%$word%' OR Manufacturer LIKE '%$word%' OR Model LIKE '%$word%' OR Category LIKE '%$word%'"; 
     } 
    } 
    $where_clause = implode(' OR ', $where_list); 

    // Add the keyword WHERE clause to the search query 
    if (!empty($where_clause)) { 
     $search_query .= " WHERE $where_clause"; 
    } 

    // Sort the search query using the sort setting 
    switch ($sort) { 
    // Ascending by job title 
    case 1: 
     $search_query .= " ORDER BY Description"; 
     break; 
    // Descending by job title 
    case 2: 
     $search_query .= " ORDER BY Description DESC"; 
     break; 
    // Ascending by state 
    case 3: 
     $search_query .= " ORDER BY Manufacturer"; 
     break; 
    // Descending by state 
    case 4: 
     $search_query .= " ORDER BY Manufacturer DESC"; 
     break; 
    // Ascending by date posted (oldest first) 
    case 5: 
     $search_query .= " ORDER BY Model"; 
     break; 
    // Descending by date posted (newest first) 
    case 6: 
     $search_query .= " ORDER BY Model DESC"; 
     break; 
    default: 
     // No sort setting provided, so don't sort the query 
    } 

    return $search_query; 
    } 

    // This function builds navigational page links based on the current page and the number of pages 
    function generate_page_links($user_search, $sort, $cur_page, $num_pages) { 
    $page_links = ''; 

    // If this page is not the first page, generate the "previous" link 
    if ($cur_page > 1) { 

     $page_links .= '<a href="' . $_SERVER['PHP_SELF'] . '?usersearch=' . $user_search . '&sort=' . $sort . '&page=' . ($cur_page - 1) . '"><-</a> '; 
    } 
    else { 
     $page_links .= '<- '; 
    } 

    // Loop through the pages generating the page number links 
    for ($i = 1; $i <= $num_pages; $i++) { 
     if ($cur_page == $i) { 
     $page_links .= ' ' . $i; 
     } 
     else { 
     $page_links .= ' <a href="' . $_SERVER['PHP_SELF'] . '?usersearch=' . $user_search . '&sort=' . $sort . '&page=' . $i . '"> ' . $i . '</a>'; 
     } 
    } 

    // If this page is not the last page, generate the "next" link 
    if ($cur_page < $num_pages) { 
     $page_links .= ' <a href="' . $_SERVER['PHP_SELF'] . '?usersearch=' . $user_search . '&sort=' . $sort . '&page=' . ($cur_page + 1) . '">-></a>'; 
    } 
    else { 
     $page_links .= ' ->'; 
    } 

    return $page_links; 
    } 

    // Grab the sort setting and search keywords from the URL using GET 
    $user_search = $_GET['usersearch']; 

    // Calculate pagination information 
    $cur_page = isset($_GET['page']) ? $_GET['page'] : 1; 
    $results_per_page = 5; // number of results per page 
    $skip = (($cur_page - 1) * $results_per_page); 

    // Start generating the table of results 
    echo '<table class="results">'; 
    echo '<td align="center">Description</td><td align="center">Manufacturer</td><td align="center">Model #</td><td align="center">Image</td>'; 

    // Generate the search result headings 
    echo '<tr class="bottomborder">'; 
    echo '</tr>'; 

    // Connect to the database 
    require_once('connectvars.php'); 
    $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 

    // Query to get the total results 
    $query = build_query($user_search,''); 
    $result = mysqli_query($dbc, $query); 
    $total = mysqli_num_rows($result); 
    $num_pages = ceil($total/$results_per_page); 

    // Query again to get just the subset of results 
    $query = $query . " LIMIT $skip, $results_per_page"; 
    $result = mysqli_query($dbc, $query); 
    while ($row = mysqli_fetch_array($result)) { 
     $description = $row['Description']; 
     $model = $row['Model']; 
     $manufacturer = $row['Manufacturer']; 
     $image = $row['Image']; 
     $hour = $row['Hour']; 
     $day = $row['Day']; 
     $week = $row['Week']; 
     $month = $row['Month']; 
     $file = $row['PDF']; 
     $ID = $row['ID']; 
     $Category = $row['Category']; 
     $CTGID = $row['CTGID']; 
     if ($image == "") { 
      $image = "No Image"; 
     }else { 
      $image = "<a class=\"thumbnail\" href=\"pp.php?ID=$ID\"><img class=\"rental_image\" src=\"$image\"><span><img src=\"$image\" ><br> $description</span></a>"; 
     } 
    echo '<tr>'; 
    echo "<td align=\"center\" valign=\"middle\" width=\"25%\"><a href=\"pp.php?ID=$ID\" alt=\"$description\">$description</a></td>"; 
    echo "<td align=\"center\" valign=\"middle\" width=\"25%\"><a href=\"pp.php?ID=$ID\">$manufacturer</a></td>"; 
    echo "<td align=\"center\" valign=\"middle\" width=\"25%\"><a href=\"pp.php?ID=$ID\">$model</a></td>"; 
    echo "<td align=\"center\" valign=\"middle\" width=\"25%\">$image</td>"; 
    echo '</tr>'; 



    } 
    echo '</table>'; 

    // Generate navigational page links if we have more than one page 
    if ($num_pages > 1) { 
    echo generate_page_links($user_search, '', $cur_page, $num_pages); 
    } 
    mysqli_close($dbc); 
?> 
<?php include("footer.php");?> 
</div> 
</body> 
</html> 
+1

你想幹什麼? –

+0

定義更準確。 – j08691

+0

你可以縮小你的代碼到相關的SQL語句:SELECT * FROM online_rental_db WHERE描述LIKE'%$ word%'或者製造商LIKE'%$ word%'或者模型LIKE'%$ word%'或者類別LIKE '%$字%''。我們沒有理由必須篩選所有代碼。 – webbiedave

回答

0

請使用AND而不是OR。例如

搜索4字: 你好,怎麼樣,是,你

有或它看起來像: LIKE '%你好%' 或.. LIKE '%怎麼%' 或.. LIKE「%是%'或...'%你%'

現在想連續發生四個單詞中的任何一個發現它被選中和顯示。

有了,它看起來像: LIKE '%你好%' 和.. LIKE '%怎麼%' 和.. LIKE '%是%' 和...... '你%%'

現在只有具有四個詞的行將僅被選擇。

你也可以說,在任何一行中,蘋果或橘子都會被選中, 在AND和蘋果和橘子意味着只有兩種東西是必需的。

+0

我試圖用AND代替或OR,結果沒有搜索結果被返回,無論我輸入什麼。我現在使用的代碼是$ where_list [] =「說明LIKE'%$ word%'和製造商LIKE'%$ word%'和模型LIKE'%$ word%'和類別LIKE'%$ word%''; –