2015-02-26 3 views
0

Я использую следующий код для создания функции поиска для своего сайта с использованием PHP/MYSQL.PHP: не показывать один и тот же продукт дважды?

Этот код будет искать размеры и цвета, если флажки выделены и отобразятся на моей странице.

пример:

checkbox 1 = small 
checkbox 2 = large 
checkbox 3 = xxlarge 
checkbox 4 = red 
checkbox 5 = black 
etc etc ...... 

если пользователи выбирают small and large as the size and red as the color, мой PHP будет возвращать продукты, которые имеют те полномочия.

Это PHP код:

<?php 
error_reporting(-1); 
ini_set('display_errors', 'On'); 
include "config/connect.php"; 
$searchList = ""; 
$clause = " WHERE ";//Initial clause 
$sql="SELECT * 
FROM `yt` 
INNER JOIN `ATTRIBUTES` ON yt.id=ATTRIBUTES.id";//Query stub 
if(isset($_POST['submit'])){ 
    if(isset($_POST['keyword'])){ 
     foreach($_POST['keyword'] as $c){ 
      if(!empty($c)){ 
       ##NOPE##$sql .= $clause."`".$c."` LIKE '%{$c}%'"; 
       $sql .= $clause . " (ATTRIBUTES.sizes LIKE BINARY '$c' OR ATTRIBUTES.colors LIKE BINARY '$c')"; 
       $clause = " OR ";//Change to OR after 1st WHERE 
      } 
     } 
     //print "SQL Query: $sql<br />"; //<-- Debug SQl syntax. 
     // Run query outside of foreach loop so it only runs one time. 
     $query = mysqli_query($db_conx, $sql); 
     //var_dump($query); //<-- Debug query results. 
     // Check that the query ran fine. 
     if (!$query) { 
      print "ERROR: " . mysqli_error($db_conx); 
     } else { 
      // Use $query inside this section to make sure $query exists. 
      $productCount = mysqli_num_rows($query); 
      $i=0; // count the output amount 
      if ($productCount > 0) { 
       while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){ 
        $id = $row["id"]; 
        $product_name = $row["product_name"]; 
        $searchList .= ''.$product_name.''; 
       } 
      } 
     } 
    } 
} 
?> 

ВОПРОС, ЧТО Я ИМЕЮ:

, если продукт имеет малый и большой (оба) в качестве учетных данных и пользователей поиска маленький и большой, мой PHP вернет тот же элемент дважды.

Как я могу остановить php, возвращая тот же продукт дважды в случаях, как указано выше?

любой совет будет оценен.

Я использовал GROUP BY, как предложено следующим образом:

$sql="SELECT * 
FROM `yt` GROUP BY yt.id 
INNER JOIN `ATTRIBUTES` ON yt.id=ATTRIBUTES.id" 

но выдает следующее сообщение об ошибке:

ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN `ATTRIBUTES` ON yt.id=ATTRIBUTES.id WHERE (ATTRIBUTES.sizes LIKE BIN' at line 3 
+0

Попробуйте 'SELECT DISTINCT * ....' http://www.mysqltutorial.org/mysql-distinct.aspx –

+0

@ ʰᵈˑ, нет, это не работает. он по-прежнему возвращает дублированные элементы. потому что таблица элементов отделена от таблицы цветов и размеров. извините, я должен был упомянуть об этом в моем вопросе. – TERO

ответ

0

Вы должны использовать SQL "GROUP BY" функции. Если yt.id - ваш идентификатор продукта, это будет «GROUP BY yt.id», добавленный к вашему запросу.

Try:

<?php 

error_reporting(-1); 
ini_set('display_errors', 'On'); 
include "config/connect.php"; 
$searchList = ""; 
$clause = " WHERE ";//Initial clause 
$sql="SELECT * 
FROM `yt` 
INNER JOIN `ATTRIBUTES` ON yt.id=ATTRIBUTES.id";//Query stub 
if(isset($_POST['submit'])){ 
    if(isset($_POST['keyword'])){ 
     foreach($_POST['keyword'] as $c){ 
      if(!empty($c)){ 
       ##NOPE##$sql .= $clause."`".$c."` LIKE '%{$c}%'"; 
       $sql .= $clause . " (ATTRIBUTES.sizes LIKE BINARY '$c' OR ATTRIBUTES.colors LIKE BINARY '$c')"; 
       $clause = " OR ";//Change to OR after 1st WHERE 
      } 
     } 

     //append "GROUP BY" 
     $sql .= " GROUP BY yt.id "; 

     //print "SQL Query: $sql<br />"; //<-- Debug SQl syntax. 
     // Run query outside of foreach loop so it only runs one time. 
     $query = mysqli_query($db_conx, $sql); 
     //var_dump($query); //<-- Debug query results. 
     // Check that the query ran fine. 
     if (!$query) { 
      print "ERROR: " . mysqli_error($db_conx); 
     } else { 
      // Use $query inside this section to make sure $query exists. 
      $productCount = mysqli_num_rows($query); 
      $i=0; // count the output amount 
      if ($productCount > 0) { 
       while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){ 
        $id = $row["id"]; 
        $product_name = $row["product_name"]; 
        $searchList .= ''.$product_name.''; 
       } 
      } 
     } 
    } 
} 
?> 
+0

Пожалуйста, просмотрите мои изменения. – TERO

+0

такой же ошибка. на самом деле я попробовал это, как ваш первый, прежде чем я попробовал это по-другому. оба бросают ту же ошибку. – TERO

+0

Можете ли вы поделиться с вами текущим кодом, пожалуйста? – MegaAppBear

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