0

我已经用 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>
4

2 回答 2

1

我会使用全文索引来匹配.

于 2012-05-18T19:46:45.570 回答
0

Kindly use the AND not OR. Example

Searching 4 word: Hello, How, are, you

With OR it looks like: like '%Hello%' or .. like '%How%' or .. like '%are%' or ... '%you%'

Now want would happen in a row any of the four words found it is selected and displayed.

With AND it looks like: like '%Hello%' and .. like '%How%' and .. like '%are%' and ... '%you%'

Now only the row which has the four words would be only selected.

Your can also say that in any row as Apples or Oranges would be selected, In AND Apples and Oranges means only having both things is required.

于 2012-05-18T20:55:20.373 回答