2016-04-17 3 views
1

Ich mache erweiterte Suche basierend auf Titel und hier ist mein Code. Zuerst suche ich nach dem ganzen Titel. Wenn eines der Bücher nicht gefunden wird, suche ich basierend auf jedem im Titel vorhandenen Wort.Doppelte Ergebnisse bei der Suche mit explodieren in der erweiterten Suche

Das Problem besteht darin, wenn zwei oder mehr Wörter Titel im zweiten Fall übereinstimmen, dann druckt es doppelte Bücher.

$qry="select * from books where quantity>0 "; 
if(isset($title)&&isset($submit1)) 
$qry.=" and title like '%".$title."%' "; 
$books=mysqli_query($con,$qry); 
     $numrows=mysqli_num_rows($books); 

     if($numrows>0){ 
     while($row=mysqli_fetch_assoc($books)){ 
      //print books 
     } 
     } 
     else if(isset($submit1)&&isset($title)){ 
      $words=explode(" ",$title); 
      $notfound=true; 
      foreach($words as $value){ 
       $qry="select * from books where quantity>0 "; 

       $qry.=" and title like '%".$value."%' "; 
       $books=mysqli_query($con,$qry); 
       $numrows=mysqli_num_rows($books); 

       if($numrows>0){ 
        while($row=mysqli_fetch_assoc($books)){ 
         // print based on each word 
        }} 
+0

Gibt es einen bestimmten Grund, warum Sie eine separate Abfrage für den Titel zu tun und jedes Wort statt 'or' zu verwenden? –

+0

Wenn der Titel gefunden wird, muss nicht jedes Wort überprüft werden. also habe ich das getan – user6181297

+0

In Ordnung, aber warum nicht 'oder' in der Abfrage basierend auf Wörtern verwenden? Du würdest keine Duplikate bekommen. –

Antwort

1

Statt eine separate Abfrage für jedes Wort zu tun, und der Umgang mit Duplikaten nach, sollten Sie Ihre SQL-Abfrage ändern sofort für eines der Wörter suchen or verwenden. Vergiss die Klammern nicht, da du dort eine andere Bedingung hast.

Schließlich sollten Sie mit etwas mehr oder weniger am Ende wie folgt:

$words=explode(" ",$title); 
$conditions = []; 

foreach ($words as $word) { 
    $conditions[] = "title like '%" . $word ."%'"; 
} 

$query = sprintf(
    "select * from books where quantity > 0 and (%s)", 
    join(" or ", $conditions) 
); 

$books = mysqli_query($con, $query); 
$numrows = $mysqli_num_rows($books); 

... 
+0

Verstanden. Was ist der beste Weg oder Bedingungen und Bedingungen? – user6181297

+0

'$ conditions' speichert die' like' Bedingungen für jedes Wort. Wenn Sie nach Titeln suchen möchten, die eines der Wörter enthalten, sollten Sie 'oder' verwenden, um sie zu verbinden. Wenn Sie Titel mit allen Wörtern suchen möchten, verwenden Sie 'und'. –

Verwandte Themen