2015-04-14 6 views
1

Я пытаюсь создать функцию поиска в PHP, однако натолкнулся на небольшую проблему. Когда я вхожу в один поисковый запрос, я получаю ожидаемый результат (отдельная запись, один результат поиска указан), но когда я ввожу 2 или более допустимых условия поиска, я получаю одну и ту же запись, указанную несколько раз. Может кто-нибудь указать, где я ошибаюсь, пожалуйста?Функция поиска возвращает один и тот же результат несколько раз

public function product_search($search_terms) 
{ 
    $search_terms = htmlspecialchars($search_terms); 
    $search_terms = stripslashes($search_terms); 
    $search_terms_array = explode(" ", $search_terms); 
    $terms_count = count($search_terms_array); 
    $zerocount = 0; 
    for($i = 0; $i < $terms_count; $i++) 
    { 
     $search_terms_array = trim($search_terms_array[$i]); 
     ${"query".$i} = $this->mysqli_link->query("SELECT * FROM sjs_product_list WHERE prod_tags LIKE '%" . $search_terms_array[$i] . "%'"); 
     if(${"query".$i}->num_rows < 1) 
     { 
      $zerocount++; 
     } 
     else 
     { 
      while($row = ${"query".$i}->fetch_array()) 
      { 
       $rows[] = $row; 
      } 
      foreach($rows as $row) 
      { 
       echo "<h3><a href=\"index.php?section=products&amp;subsection=" . $row['prod_category'] . "&amp;prodid=" . $row['prod_id'] . "\">" . $row['prod_name'] . "</h3></a><img src=\"includes/images/product_images/" . $row['prod_category'] . "/" . $row['prod_pic_filename'] . "\" alt=\"\"/><p>Price: " . $row['prod_price'] . "</p><p>" . $row['prod_code'] . "</p>"; 
      } 
     } 
    } 
    if($zerocount == $terms_count) 
    { 
     echo "<h3>Your search terms returned 0 results. Please try using different search terms."; 
    } 
} 
+1

Вы заменить массив со строкой, когда вы делаете '$ search_terms_array = подрезать ($ search_terms_array [$ я]);' – Barmar

+0

Подробнее о массивах. Вы должны использовать '$ query [$ i]' вместо '$ {" query ". $ I}'. Массивы являются фундаментальной концепцией практически на всех языках программирования. – Barmar

+0

На самом деле нет необходимости использовать разные переменные для каждого результата запроса. Вы можете просто повторно использовать одну и ту же переменную '$ query' каждый раз. – Barmar

ответ

0

Изменить

$search_terms_array = trim($search_terms_array[$i]); 

в

$search_terms_array[$i] = trim($search_terms_array[$i]); 

Вы заменяли весь массив только первый элемент. Затем, когда вы использовали $search_terms_array[$i] после этого, вы просто получили i th chararacter этой строки.

Другая проблема: вы не очищаете массив $rows каждый раз через цикл. Помещенный:

$rows = array(); 

перед тем

while ($row = ${"query".$i}->fetch_array()) 

Вы печать всего $rows массива внутри цикла, так что каждый раз, когда вы печатаете строки из предыдущей итерации, а также, несмотря на то, что они уже были распечатаны.

+0

Привет. Спасибо за это, сделал изменения, но все еще получал ту же проблему. Только одна запись в базе данных для тестовых целей, однако, если я помещу в 2 условия поиска, она вернет запись 3 раза, если я положу три поисковых запроса, она вернет запись 6 раз. Если я поместил все 5 поисковых запросов, связанных с записью, он возвращает запись 15 раз? –

+0

Я все еще разбираюсь с ООП и массивами, так что не медведь со мной на этом :) –

+0

Я не вижу никакого способа, которым этот код мог бы это сделать. Возможно, вы несколько раз вызываете 'product_search'? – Barmar

0

Заменить ниже двух линий в коде: -

<?php 
$search_key = trim($search_terms_array[$i]); 
${"query".$i} = $this->mysqli_link->query("SELECT * FROM sjs_product_list WHERE prod_tags LIKE '%" . $search_key . "%'"); 
?> 
Смежные вопросы