2012-05-18 5 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

ответ

1

Я бы использовал fulltext index with match against.

+0

У этого есть свои ограничения, но да, это все же лучше, чем наличие большого количества 'LIKE %%'s. –

0

Просьба использовать И НЕ ИЛИ. Пример

Поиск 4 слова: Привет, Как, являются, вы

С ИЛИ это выглядит следующим образом: как '% Hello%' или .. как '% Как%' или .. как «% являются % 'или ...'% you% '

Теперь хотите, чтобы в строке появилось любое из четырех слов, которое было выбрано и отображено.

С И это выглядит следующим образом: как '% Hello%' и .. как '% Как%' и .. как '% в%' и ... '% вы%'

Теперь только строка, которая имеет четыре слова, будет выбрана только.

Вы также можете сказать, что в любой строке, если будут выбраны Яблоки или Апельсины, В И Яблоки и Апельсины означает, что требуется только то, что требуется.

+0

Я попытался использовать И вместо ИЛИ ИЛИ, это не привело к тому, что результаты поиска не возвращались независимо от того, что я набрал. Код, который я использовал сейчас, был $ where_list [] = "Описание LIKE '% $ word%' AND Manufacturer LIKE '% $ word%' AND Model LIKE '% $ word%' AND Category LIKE '% $ word%'"; –

Смежные вопросы