2010-11-24 9 views
0

Ich habe ein Problem mit einem SQL-Aufruf, den ich habe. Letztendlich führe ich einen AJAX-Anruf aus einem Suchfeld aus und gebe die Ergebnisse an den Bildschirm zurück. Ich beschränke die Ergebnisse auf 5, aber wenn die Gesamtzahl der Ergebnisse 5 übersteigt, biete den Link an, um alles anderswo anzuzeigen. Ich dachte, indem Sie einfach eine COUNT() Klausel in diesem würde sich um das Problem kümmern und während COUNT() die volle Anzahl der Treffer korrekt zurückgibt, tötet es meine while Anweisung beim Durchschleifen und gibt nur das erste Ergebnis zurück. Wenn ich count() entferne, funktioniert alles.Warum bricht meine count() - Klausel meine while-Anweisung?

CODE

<?php 

if(isset($_POST['word']) && $_POST['word'] != "") 
    { 
     $q=$_POST['word']; 

      try { 
       $db = new PDO('mysql:host=localhost;dbname=DB', 'USER', 'PW'); 
       $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
       $db->beginTransaction(); 

       $stmt = $db->prepare("SELECT COUNT(ID) as counter, ID, fname, lname FROM tablename WHERE fname LIKE ? or lname LIKE ? ORDER BY ID LIMIT 5"); 

       $stmt->execute(array('%'.$q.'%', '%'.$q.'%')); 

       $foundrows = $db->query("SELECT FOUND_ROWS()")->fetchColumn(); 

       $db->commit(); 
      } 

      catch (PDOException $e) 
      { 
       echo "There was a system DB error. <br>".$e->getMessage();   
      }    


     if(isset($foundrows) && $foundrows == 0) { 
      echo "<div class='display_box' align='left'> 
       No matching results found</div>"; 
     } else {   

       while($row = $stmt->fetch()) { 

        $counter = $row['counter']; 

        $id = $row['ID']; 
        $fname = $row['fname']; 
        $lname = $row['lname']; 

      ?> 
        <a href="#" style="text-decoration:none; color:#000;"> 
        <div class="display_box" align="left"> 

        <?php echo $fname; ?>&nbsp;<?php echo $lname; ?><br/> 
        </div></a> 

<?php  
       } 

       if(isset($counter) && $counter > 5) { 
?>     
        <a href="#" style="text-decoration:none; color:#000;"> 
        <div class="display_box" align="left"> 
        <?php echo (5-$counter)." additional matches found."; ?> 
        </div></a> 
<?php         
       } 
     } 
    } 
?> 
+0

Titel sollte eine Zusammenfassung Ihrer Frage sein – meagar

+0

@meagar - Ich dachte 'was da puh' war ausreichend;). Vielen Dank! – JM4

Antwort

1

wenn die Gesamtzahl der Ergebnisse 5 überschreiten, Link stellt Ihnen alle an anderer Stelle zu sehen

Um die Anzahl der Zeilen zu bestimmen, die zurückgegeben worden wäre, es keine LIMIT-Klausel gewesen, verwenden SQL_CALC_FOUND_ROWS

SELECT SQL_CALC_FOUND_ROWS ID, fname, lname FROM tablename WHERE fname LIKE ? or lname LIKE ? ORDER BY ID LIMIT 5 

Dann wird Ihr Anruf an SELECT FOUND_ROWS() die Nummer zurückgeben, hatte es keine Grenze gab. Hinweis: Zwischen der SELECT SQL_CALC_FOUND_ROWS und der SELECT FOUND_ROWS()-Anweisung dürfen keine weiteren SQL-Aufrufe erfolgen, da sonst der Wert nicht korrekt ist.

2

COUNT() ist ein Aggregat Betrieb auf dem Tisch, die nur eine Zeile zurückgibt, weshalb sind Sie nicht 5 Ergebnisse bekommen, wie Sie aus der Abfrage erwarten, wenn es darunter.

Ein Weg, können Sie bekommen, was Sie wollen, ist durch eine SUBSELECT Klausel in Ihre Abfrage:

SELECT (SELECT COUNT(ID) FROM tablename) as counter, ID, fname, lname FROM tablename WHERE fname LIKE ? or lname LIKE ? ORDER BY ID LIMIT 5

Dies wird die 5 Ergebnisse angezeigt Sie erwarten, mit einer vollen Anzahl der Zeilen in der Tabelle als eine Spalte in jeder Zeile.

0

Das hat nichts mit PDO oder PHP zu tun. Wenn Sie eine Aggregatfunktion angeben (wie COUNT(), MAX(), ...) müssen Sie die Zeilen gruppieren, da Sie (natürlich) keine einzelne Zeile zählen können. Wenn Sie GROUP BY nicht angeben, wird die gesamte Ergebnismenge reduziert.

Verwandte Themen