2010-04-23 15 views
13

PDO hat anscheinend keine Möglichkeit, die Anzahl der von einer Select-Abfrage zurückgegebenen Zeilen zu zählen (mysqli hat die num_rows Variable).PHP PDO - Num Zeilen

Gibt es einen Weg, dies zu tun, kurz count($results->fetchAll()) zu verwenden?

+1

möglich duplizieren von http://StackOverflow.com/Questions/460010/work-around-for-PHP5S-PDO-Rowcount-Mysql-Ausgabe - Diese Frage ist die gleiche wie Ihre. Die akzeptierte Antwort dort ist was du willst. – zombat

+5

Ich sah diese Frage, aber die Antwort ist scheiße. Das Ausführen einer zweiten Abfrage an die Datenbank, nur um die Anzahl der Zeilen zu sehen, die jetzt in einem Datensatz gespeichert ist, ist wirklich dumm. – Ian

Antwort

12

Nach der Anleitung gibt es eine Methode; aber es sollte nicht (Zitat) verwendet werden:

Bei den meisten Datenbanken PDOStatement::rowCount() nicht return die Anzahl der betroffenen Zeilen von eine SELECT Aussage.
Verwenden Sie stattdessen PDO::query() eine SELECT COUNT(*) Aussage mit den gleichen Prädikaten wie Ihre beabsichtigten SELECT Anweisung zu erteilen, dann verwenden PDOStatement::fetchColumn() zu die Anzahl der Zeilen abrufen, die zurückgegeben werden.
Ihre Anwendung kann dann die richtige Aktion ausführen.


Wenn Sie bereits ein Re-Cord haben und wissen wollen, wie viele Zeilen in ihm sind, werden Sie die Daten abrufen müssen, einer der fetch* Verfahren; und nutze die Anzahl - wie du es vorgeschlagen hast.

+7

Ja, also mein Problem. Wie ist es möglich, dass PDO * keine num_rows Funktion hat? Jeder andere db connector lib da draußen hat es. – Ian

+0

Wenn Sie die Daten haben, können Sie die Anzahl der Zeilen, die es enthält, selbst zählen * (wie Sie vorgeschlagen haben) *; also nehme ich an, dass es keine * echte * Notwendigkeit für eine Methode gibt, die das tun würde ... –

+5

Ergreifen Sie alle Daten nur für das Zählen, dann ist das Werfen dieser Anordnung sehr verschwenderisch, besonders wenn es eine große Reihe ist. – Ian

0

Eine weitere Option, die näher an der num_rows Variable in mysqli und der entsprechenden C-API-Funktion mysql_num_rows() sein kann. Verwenden Sie die MySQL-Funktion FOUND_ROWS(), die dieselben Informationen zurückgibt, ohne alle Datensätze im Ergebnis erneut zählen zu müssen.

Beispiel:

$pdoDB->query('SELECT FOUND_ROWS()')->fetchColumn() 
+0

Diese Antwort macht heutzutage keinen Sinn, denn Sie können den normalen Weg zählen –

2

Obwohl PDO offenbar alle Mittel hat die Anzahl der Zeilen aus einer Auswahlabfrage für mysql zurückgegeben zu zählen, was noch wichtiger ist, ist, dass es keine Verwendung für eine solche Funktion in den ersten Platz.

Jedes Mal, wenn Sie eine Idee haben, rowCount() für eine SELECT-Abfrage zu verwenden, wäre dies entweder überflüssig oder sogar schädlich. Siehe PDO rowCount():

  • falls Sie haben die bereits ausgewählten Daten, diese Funktion ist überflüssig, da Sie einfach die Daten
  • falls zählen können Sie diese Funktion verwenden möchten, nur die Zählung zu bekommen, wäre es schädlich, Da sollten Sie niemals Daten auswählen, nur um sie zu zählen. Wählen Sie nur die Anzahl aus und verwenden Sie stattdessen SELECT count (*).
+2

Haben Sie sogar die akzeptierte Antwort auf diese Frage gelesen? Aus der PDO-Dokumentation: "Wenn die letzte vom zugeordneten PDOS-Statement ausgeführte SQL-Anweisung eine SELECT-Anweisung war, können einige Datenbanken die Anzahl der von dieser Anweisung zurückgegebenen Zeilen zurückgeben. Dieses Verhalten ist jedoch nicht für alle Datenbanken garantiert und sollte nicht verlässlich sein portable Anwendungen. " – Ian

+3

Nun, wenn Sie nach der portablen Anwendung fragen, markieren Sie Ihre Frage nicht mit mysql. –

+0

Wie soll ich dann rechnen? Ich benutze eine PHP MySQL Abfrage später im HTML-Dokument, um Daten aus der Datenbank anzuzeigen, aber das Element, in dem ich die Zählung anzeigen möchte, kommt vor dem Holen und Anzeigen der Daten ??? – Anthony