Zeilenanzahl mit PDO
Gibt es viele widersprüchliche Aussagen rund um. Was ist der beste Weg, um Zeilenanzahl mit PDO in PHP? Vor der Verwendung von PDO, ich habe einfach verwendet mysql_num_rows
.
fetchAll
ist etwas, was ich nicht will weil ich manchmal den Umgang mit großen Datenmengen, also nicht gut für meinen Gebrauch.
Haben Sie irgendwelche Vorschläge?
InformationsquelleAutor James | 2009-05-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht der eleganteste Weg, es zu tun, plus es umfasst eine zusätzliche Abfrage.
PDO
PDOStatement::rowCount()
, die anscheinend nicht Arbeit in MySql. Was für ein Schmerz.Vom PDO-Doc:
EDIT: Die obigen code-Beispiel wird eine vorbereitete Anweisung verwendet, die in vielen Fällen wahrscheinlich unnötig für den Zweck der Zählung der Zeilen, also:
nickf korrekt ist. mysql_num_rows() funktioniert nicht bei der Verwendung von PDO obwohl es?
Mit diesem Ansatz
fetchColumn()
gibt einen string zurück, "1234" ... deine Bearbeitung hatecho count($nRows);
-count()
ist eine array-Funktion :P. ich würde empfehlen, auch die Typumwandlung ist das Ergebnis vonfetchColumn()
auf eine ganze Zahl.$count = (int) $stmt->fetchColumn()
$Ergebnis->rowCount() für mich gearbeitet! mit mysql...
Die nicht-prepared Statements Ansatz ist die Rückkehr 1 nur statt der tatsächlichen Anzahl von Zeilen. Die vorbereitete Anweisung funktioniert. Was kann das Problem sein ?
InformationsquelleAutor karim79
Als ich schrieb bereits in eine Antwort auf eine ähnliche Frage, der einzige Grund
mysql_num_rows()
gearbeitet wird, weil es wurde intern abrufen, alle Zeilen, Sie geben diese Informationen, auch wenn es nicht scheinen, wie es um Sie.So, in PDO, sind Ihre Optionen:
FOUND_ROWS()
Funktion.fetchAll()
Funktion holt alle Zeilen in ein array, dann verwenden Siecount()
.SELECT COUNT(*)
als karim79 vorgeschlagen.fetch_all eigentlich ist fetchAll() 🙂
Option 2 ist nicht ratsam, wenn das Ergebnis ist groß.
InformationsquelleAutor Chad Birch
Du sollte nicht haben gewesen benutze es in den ersten Platz.
mysql_num_rows()
sowiePDOStatement::rowCount()
bedeutet, dass Sie bereits ausgewählt Ihre Daten. In diesem Fall gibt es nur zwei mögliche Anwendungsfälle für eine solche Funktion:Und der ehemaligen man sollte nie benutzt werden. Man sollte nie wählen Sie die Zeilen zu zählen, da Ihre server in der Tat kann ersticken aufgrund des großen Datensatzes zurückgegeben.
Neben, Auswahl von Zeilen nur zu zählen, Sie macht einfach keinen Sinn. Ein
count(*)
Abfrage ausgeführt werden, stattdessen mit nur einer Zeile zurückgegeben.Zweiten Anwendungsfall ist weniger katastrophal aber eher sinnlos: in Fall müssen Sie wissen, ob Ihre Abfrage zurückgegebenen Daten, haben Sie immer die Daten selbst!
Sagen, wenn Sie auswählen, wird nur eine Zeile, dann einfach ihn zu Holen, und überprüfen Sie das Ergebnis:
In Fall, dass Sie benötigen, um viele Zeilen haben, dann können Sie
fetchAll()
.Beachten Sie, dass in einer web-Anwendung, die Sie sollten nie wählen Sie eine riesige Menge von Zeilen. Nur Zeilen, die tatsächlich verwendet auf einer web-Seite ausgewählt werden sollte. Für welchen Zweck ein
LIMIT
oder ähnliche Klausel in SQL verwendet werden. Und für solch eine moderate Menge an Daten, es allen Recht zu verwendenfetchAll()
In solch einem seltenen Fall, wenn Sie auswählen müssen, um eine wirkliche große Menge von Zeilen (in einer Konsolenanwendung zum Beispiel), zu reduzieren die Menge an Arbeitsspeicher verwendet wird, müssen Sie eine unbuffered query, aber in diesem Fall
rowCount()
ist nicht verfügbar sowieso, so gibt es keine Verwendung für diese Funktion auch.Also Sie sehen, es gibt keinen use-case-weder für
rowCount()
noch für eine extra Abfrage zu ersetzen, wie vorgeschlagen, in der akzeptierten Antwort.Es ist nicht. Bitte denken Sie daran: ein Entwickler sollte nie tun, es auf diese Weise. Die Suchabfrage sollte nie wieder zurückkehren, alle 284 Zeilen. 15 zurückgebracht werden, um zu zeigen, und einem Reihe von separaten Abfrage zu sagen, dass 284 gefunden wurden.
Dies ist ein sehr guter Punkt - unintuitive auf den ersten, aber gültig. Die meisten Menschen vergessen, dass zwei einfache SQL-Abfragen sind Art schneller als eine etwas größere. Gerechtfertigt zählen, man müsste eine sehr langsame Abfrage kann optimiert werden und wird vermutlich Ausbeute wenige Ergebnisse. Danke für den Hinweis!
Common Sense: Nur du sicher sein: nicht fetchAll() eine schlechte Idee, wenn die Ergebnismenge sehr groß ist? Wäre es nicht besser dann zu verwenden, fetch (), um Daten aufeinander.
das ist genau das, was gesagt wird, in dem letzten Absatz meiner Antwort
InformationsquelleAutor Your Common Sense
Das ist super spät, aber ich lief in das problem und ich mache das:
Es ist wirklich einfach und leicht. 🙂
Die Auswahl von alle werden die Daten nur zu zählen, wird gegen die elementarsten Regeln der Datenbank-Interaktion.
Vielleicht möchten Sie haben ein Fortschrittsbalken für alle zurückgegebenen Werte, so müssen Sie wissen, die Anzahl der Zeilen im Voraus.
InformationsquelleAutor Dan
Landete ich mit diesem:
InformationsquelleAutor Eric Warnke
Dieser Beitrag ist alt, aber Immer Zeilenanzahl in php mit PDO ist einfach
InformationsquelleAutor
Dies ist eine alte post, aber frustriert auf der Suche nach alternativen. Es ist super schade, dass PDO fehlt diese Funktion, vor allem als PHP-und MySQL-neigen dazu, hand in hand zu gehen.
Es ist eine unglückliche Fehler in der Verwendung von fetchColumn() als Sie nicht mehr verwenden kann, dass das Ergebnis-set (effektiv) als die fetchColumn() bewegt sich die Nadel in die nächste Zeile. So zum Beispiel, wenn Sie ein ähnliches Ergebnis wie
Wenn Sie mit fetchColumn() können Sie herausfinden, dass es noch 3 Früchte zurückgegeben, aber wenn du jetzt eine Schleife über das Ergebnis, Sie haben nur zwei Spalten, Die den Preis von fetchColumn() ist der Verlust der ersten Spalte der Ergebnisse, nur um herauszufinden, wie viele Zeilen zurückgegeben wurden. Das führt zu schlampiger Programmierung und Total Fehler geritten Ergebnisse, wenn Sie umgesetzt werden.
So, jetzt, mit fetchColumn() Sie haben zu implementieren und völlig neue Anruf-und MySQL-Abfrage nur, um einen frischen zu arbeiten-Ergebnis-set. (die sich hoffentlich nicht geändert hat, seit Ihrer letzten Abfrage), ich weiß, unwahrscheinlich, aber es kann passieren. Außerdem wird der Aufwand für dual-Abfragen auf alle Zeilenanzahl Validierung. Die für dieses Beispiel ist klein, aber parsing 2 Millionen Zeilen, die auf eine verknüpfte Abfrage, nicht zu einem angenehmen Preis zu zahlen.
Ich Liebe PHP und unterstützt alle beteiligten in die Entwicklung als auch die Gemeinschaft als ganzes, mit PHP auf einer täglichen basis, aber hoffe wirklich, dass diese gerichtet ist, in zukünftigen Versionen. Das ist wirklich meine einzige Beschwerde mit PHP die PDO, die sonst eine große Klasse.
InformationsquelleAutor Eric
Beantworten, weil ich gefangen, habe mich jetzt durch dieses wissen und vielleicht wird es nützlich sein.
Beachten Sie, dass Sie cant Holen Ergebnisse zweimal. Speichern Sie die fetch-Ergebnis in array, bekommen Zeilenanzahl von
count($array)
- und output-Ergebnisse mitforeach
.Zum Beispiel:
InformationsquelleAutor csharp newbie
Wenn Sie nur wollen, um die Anzahl der Zeilen (nicht der Daten) dh. mit COUNT(*) in einer vorbereiteten Erklärung, dann alles, was Sie tun müssen, ist, um das Ergebnis abzurufen und Lesen Sie den Wert:
Tatsächlich abrufen, alle Zeilen (Daten), führen Sie eine einfache Zählung ist eine Verschwendung von Ressourcen. Wenn die Ergebnismenge groß ist Ihr server kann daran ersticken.
InformationsquelleAutor madfish
Haben Sie einen Blick auf diesen link:
http://php.net/manual/en/pdostatement.rowcount.php
Es wird nicht empfohlen zu verwenden rowCount() in der SELECT-Anweisungen!
InformationsquelleAutor Reza Neghabi
Wenn es ist eine Frage der mysql wie zu zählen oder bekommen, wie viele Zeilen in einer Tabelle mit PHP die PDO - ich diese
credits geht an Mike @ codeofaninja.com
InformationsquelleAutor Robert
Variablen verwenden innerhalb der Abfrage können Sie
bindValue()
oderbindParam()
Verwenden von Variablen innerhalb einer Abfrage, die Sie haben zu verwenden
bindValue()
oderbindParam()
. Und nicht verketten der Variablen mit" . $variable . "
GL
InformationsquelleAutor IT Developers
Gibt es eine einfache Lösung. Wenn Sie die PDO-Verbindung zu deiner DB so:
Dann die Abfrage an die DB:
Und schließlich die Anzahl der passenden Zeilen deiner Abfrage schreiben, wie diese
InformationsquelleAutor Vlad
Hier ist eine maßgeschneiderte Erweiterung der PDO-Klasse, mit einer helper-Funktion zum abrufen der Anzahl von Zeilen enthalten, die von der letzten Abfrage "WHERE" - Kriterien.
Müssen Sie möglicherweise mehr hinzufügen, 'Handler', obwohl, je nachdem, was Befehle, die Sie verwenden. Jetzt funktioniert es nur für Abfragen, verwenden Sie "AUS" oder "UPDATE ".
InformationsquelleAutor Venryx
Einen schnellen one-liner zu bekommen, wird der erste Eintrag zurückgegeben. Das ist schön für die sehr grundlegenden Fragen.
Referenz
InformationsquelleAutor itsazzad
Versuchte ich
$count = $stmt->rowCount();
mit Oracle 11.2 und es hat nicht funktioniert.Ich beschloss, verwendet eine for-Schleife, wie unten dargestellt.
InformationsquelleAutor manas mukherjee
Für gerade fragt, wo möchte ich eine bestimmte Zeile, und möchte wissen, ob es gefunden wurde, verwende ich etwas wie:
InformationsquelleAutor user5862537
wenn du ein COUNT(*) in deiner mysql-Anweisung wie in
Ihre mysql-Abfrage ist bereits das zählen der Anzahl von Ergebnis-warum das zählen wieder in php? um das Ergebnis zu erhalten Ihrer mysql -
sowie
$nb
enthält die ganze Zahl, die Sie gezählt haben, die mit Ihrem mysql-Anweisungein bisschen zu lang zu schreiben, aber schnell ausgeführt
Bearbeiten:
sorry für den falschen post, aber wie einige Beispiel zeigen, Abfrage mit count-in, ich wurde darauf hindeutet, indem Sie die mysql-Ergebnis, aber wenn Sie nicht, verwenden Sie die count in sql fetchAll() ist effizient, wenn Sie speichern Sie das Ergebnis in eine variable, die Sie nicht verlieren eine Linie.
count($table)
zurück, die Anzahl der Zeile und Sie können weiterhin verwenden das Ergebnis nach wie$row = $table[0]
oder mit einemforeach
InformationsquelleAutor Surpriserom
Können Sie kombinieren die beste Methode in einer Zeile oder Funktion, und die neue Abfrage automatisch für Sie generiert:
InformationsquelleAutor Bryan
InformationsquelleAutor Amranur Rahman
InformationsquelleAutor alpazull
Verwenden Sie den parameter
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, sonst zeigen -1:Usen parametro
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
sin ello Verkauf -1Beispiel:
InformationsquelleAutor Victor Idrogo Aliaga