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

ORではなくANDを使用してください。例

4つの単語を検索しています:こんにちは、どのように、あなたは

ORを使用すると、次のようになります。'%Hello%'または..'%How%'または..'%are%'または...'%you%'

これで、選択されて表示された4つの単語のいずれかが連続して発生します。

ANDを使用すると、次のようになります。

これで、4つの単語を含む行のみが選択されます。

また、ApplesまたはOrangesが選択されるので、どの行でも、In AND Apples and Orangesは、両方のものだけが必要であることを意味します。

于 2012-05-18T20:55:20.373 に答える