$sql = "SELECT count(*) FROM `table` WHERE foo = ?";
$result = $con->prepare($sql);
$result->execute([$bar]);
$number_of_rows = $result->fetchColumn();
Dies ist nicht die eleganteste Methode und erfordert eine zusätzliche Abfrage.
PDO hat PDOStatement::rowCount()
, was anscheinend in MySql nicht funktioniert. Was für ein Schmerz.
Aus dem PDO-Dokument:
Bei den meisten Datenbanken gibt PDOStatement :: rowCount () nicht die Anzahl der Zeilen zurück, die von einer SELECT-Anweisung betroffen sind. Verwenden Sie stattdessen PDO :: query (), um eine SELECT COUNT (*) -Anweisung mit denselben Prädikaten wie Ihre beabsichtigte SELECT-Anweisung auszugeben, und verwenden Sie dann PDOStatement :: fetchColumn (), um die Anzahl der zurückgegebenen Zeilen abzurufen. Ihre Anwendung kann dann die richtige Aktion ausführen.
BEARBEITEN: Das obige Codebeispiel verwendet eine vorbereitete Anweisung, die in vielen Fällen zum Zählen von Zeilen wahrscheinlich nicht erforderlich ist.
$nRows = $pdo->query('select count(*) from blah')->fetchColumn();
echo $nRows;
fetchColumn()
eine Zeichenfolge "1234" zurück ... Ihre EDIT hatecho count($nRows);
-count()
ist eine Array-Funktion: P. Ich würde auch empfehlen, das ErgebnisfetchColumn()
in eine Ganzzahl umzuwandeln.$count = (int) $stmt->fetchColumn()
Wie ich zuvor in einer Antwort auf eine ähnliche Frage geschrieben habe , hat der einzige Grund
mysql_num_rows()
funktioniert, weil intern alle Zeilen abgerufen wurden, um Ihnen diese Informationen zu geben, auch wenn es Ihnen nicht so erschien.In PDO haben Sie folgende Möglichkeiten:
FOUND_ROWS()
Funktion.fetchAll()
Funktion, um alle Zeilen in ein Array abzurufen, und verwenden Siecount()
sie dann.SELECT COUNT(*)
Führen Sie eine zusätzliche Abfrage an , wie von karim79 vorgeschlagen.quelle
Wie so oft ist diese Frage höllisch verwirrend. Die Leute kommen hierher und haben zwei verschiedene Aufgaben :
Das sind zwei absolut unterschiedliche Aufgaben, die nichts gemeinsam haben und nicht mit derselben Funktion gelöst werden können. Ironischerweise muss für keinen von ihnen die eigentliche
PDOStatement::rowCount()
Funktion verwendet werden.Mal sehen warum
Zeilen in der Tabelle zählen
Bedeutet, dass du es schon falsch gemacht hast. Das Verwenden
mysql_num_rows()
oderrowCount()
Zählen der Anzahl der Zeilen in der Tabelle ist eine echte Katastrophe in Bezug auf den Verbrauch der Serverressourcen. Eine Datenbank muss alle Zeilen von der Festplatte lesen, den Speicher auf dem Datenbankserver belegen und dann all diesen Datenhaufen an PHP senden, wobei auch der Speicher des PHP-Prozesses verbraucht wird, wodurch Ihr Server absolut grundlos belastet wird.Außerdem macht es einfach keinen Sinn, nur Zeilen auszuwählen, um sie zu zählen.
count(*)
Stattdessen muss eine Abfrage ausgeführt werden. Die Datenbank zählt die Datensätze aus dem Index heraus, ohne die tatsächlichen Zeilen zu lesen, und gibt dann nur eine Zeile zurück.Zu diesem Zweck ist der in der akzeptierten Antwort vorgeschlagene Code fair.
Zählen der zurückgegebenen Zahlenzeilen.
Der zweite Anwendungsfall ist nicht so katastrophal wie sinnlos: Wenn Sie wissen müssen, ob Ihre Abfrage Daten zurückgegeben hat, haben Sie immer die Daten selbst!
Angenommen, Sie wählen nur eine Zeile aus. In Ordnung, Sie können die abgerufene Zeile als Flag verwenden:
Wenn Sie viele Zeilen benötigen, können Sie verwenden
fetchAll()
.Ja natürlich, für den ersten Anwendungsfall wäre es doppelt so schlimm. Aber wie wir bereits gelernt haben, nur nicht die Zeilen nur , sie zu zählen, weder mit
rowCount()
nochfetchAll()
.Wenn Sie jedoch die ausgewählten Zeilen tatsächlich verwenden möchten, ist die Verwendung nicht falsch
fetchAll()
. Denken Sie daran, dass Sie in einer Webanwendung niemals eine große Anzahl von Zeilen auswählen sollten. Nur Zeilen , die tatsächlich auf einer Webseite verwendet werden sollen, ausgewählt werden daher sind Sie bei Verwendung bekommenLIMIT
,WHERE
oder eine ähnliche Klausel in der SQL. Und für eine so moderate Datenmenge ist es in Ordnung, sie zu verwendenfetchAll()
. Und wieder verwenden Sie einfach das Ergebnis dieser Funktion in der Bedingung:Und natürlich ist es ein absoluter Wahnsinn , eine zusätzliche Abfrage auszuführen , um festzustellen, ob Ihre andere Abfrage Zeilen zurückgegeben hat, wie in den beiden oberen Antworten vorgeschlagen.
Zählen der Anzahl der Zeilen in einer großen Ergebnismenge
In einem so seltenen Fall, wenn Sie eine wirklich große Anzahl von Zeilen auswählen müssen (z. B. in einer Konsolenanwendung), müssen Sie eine ungepufferte Abfrage verwenden , um den verwendeten Speicher zu reduzieren. Dies ist jedoch der Fall, wenn
rowCount()
es nicht verfügbar ist , sodass diese Funktion ebenfalls nicht verwendet werden kann.Daher ist dies der einzige Anwendungsfall, in dem Sie möglicherweise eine zusätzliche Abfrage ausführen müssen, falls Sie eine genaue Schätzung für die Anzahl der ausgewählten Zeilen benötigen.
quelle
Das ist super spät, aber ich bin auf das Problem gestoßen und mache das:
Es ist wirklich einfach und leicht. :) :)
quelle
Am Ende habe ich Folgendes verwendet:
quelle
Dieser Beitrag ist alt, aber das Abrufen der Zeilenanzahl in PHP mit PDO ist einfach
quelle
Dies ist ein alter Beitrag, der jedoch frustriert ist, nach Alternativen zu suchen. Es ist sehr bedauerlich, dass PDO diese Funktion nicht bietet, zumal PHP und MySQL in der Regel Hand in Hand gehen.
Es gibt einen unglücklichen Fehler bei der Verwendung von fetchColumn (), da Sie diese Ergebnismenge nicht mehr (effektiv) verwenden können, wenn fetchColumn () die Nadel in die nächste Zeile bewegt. Zum Beispiel, wenn Sie ein ähnliches Ergebnis wie haben
Wenn Sie fetchColumn () verwenden, können Sie feststellen, dass 3 Früchte zurückgegeben werden. Wenn Sie jetzt das Ergebnis durchlaufen, haben Sie nur zwei Spalten. Der Preis von fetchColumn () ist der Verlust der ersten Spalte der Ergebnisse, die nur zu finden sind heraus, wie viele Zeilen zurückgegeben wurden. Dies führt zu einer schlampigen Codierung und bei der Implementierung zu völlig fehlerhaften Ergebnissen.
Mit fetchColumn () müssen Sie nun einen völlig neuen Aufruf und eine neue MySQL-Abfrage implementieren, um eine neue Arbeitsergebnismenge zu erhalten. (was sich hoffentlich seit Ihrer letzten Abfrage nicht geändert hat), ich weiß, unwahrscheinlich, aber es kann passieren. Auch der Aufwand für doppelte Abfragen bei der Validierung aller Zeilenzahlen. Was für dieses Beispiel klein ist, aber 2 Millionen Zeilen in einer verknüpften Abfrage analysiert, ist kein angenehmer Preis.
Ich liebe PHP und unterstütze alle, die an seiner Entwicklung beteiligt sind, sowie die gesamte Community, die täglich PHP verwendet, aber ich hoffe wirklich, dass dies in zukünftigen Versionen behoben wird. Dies ist "wirklich" meine einzige Beschwerde bei PHP PDO, was ansonsten eine großartige Klasse ist.
quelle
Beantworte dies, weil ich mich damit gefangen habe, weil ich das jetzt weiß und es vielleicht nützlich sein wird.
Denken Sie daran, dass Sie die Ergebnisse nicht zweimal abrufen können. Sie müssen das Abrufergebnis im Array speichern, die Zeilenanzahl von abrufen
count($array)
und die Ergebnisse mit ausgebenforeach
. Beispielsweise:quelle
Wenn Sie nur eine Anzahl von Zeilen (nicht die Daten) erhalten möchten, dh. Wenn Sie COUNT (*) in einer vorbereiteten Anweisung verwenden, müssen Sie nur das Ergebnis abrufen und den Wert lesen:
Das Abrufen aller Zeilen (Daten), um eine einfache Zählung durchzuführen, ist eine Verschwendung von Ressourcen. Wenn die Ergebnismenge groß ist, kann Ihr Server daran ersticken.
quelle
Schauen Sie sich diesen Link an: http://php.net/manual/en/pdostatement.rowcount.php Es wird nicht empfohlen, rowCount () in SELECT-Anweisungen zu verwenden!
quelle
Um Variablen innerhalb einer Abfrage zu verwenden, müssen Sie
bindValue()
oder verwendenbindParam()
. Und nicht verketten die Variablen mit" . $variable . "
GL
quelle
Wenn es um MySQL geht , wie viele Zeilen in einer Tabelle mit PHP PDO gezählt oder abgerufen werden sollen, verwende ich diese
Credits gehen an Mike @ codeofaninja.com
quelle
Ein schneller Einzeiler, um den ersten Eintrag zurückzugeben. Dies ist gut für sehr einfache Fragen.
Referenz
quelle
Ich habe es
$count = $stmt->rowCount();
mit Oracle 11.2 versucht und es hat nicht funktioniert. Ich habe mich für eine for-Schleife entschieden, wie unten gezeigt.quelle
Für direkte Abfragen, bei denen ich eine bestimmte Zeile haben möchte und wissen möchte, ob sie gefunden wurde, verwende ich Folgendes:
quelle
Es gibt eine einfache Lösung. Wenn Sie PDO verwenden, stellen Sie wie folgt eine Verbindung zu Ihrer Datenbank her:
Dann lautet die Abfrage an DB:
Und schließlich, um die Zeilen zu zählen, die Ihrer Abfrage entsprechen, schreiben Sie wie folgt
quelle
fetchColumn ()
wird verwendet, wenn Sie die Anzahl der Datensätze erhalten möchten [effisien]
Abfrage()
wird verwendet, wenn Daten und Anzahl der Datensätze abgerufen werden sollen [Optionen]
PDOStatement :: rowCount
quelle
wenn Sie in Ihrer MySQL-Anweisung ein COUNT (*) wie in
Ihre MySQL-Abfrage zählt bereits die Anzahl der Ergebnisse. Warum in PHP erneut zählen? um das Ergebnis Ihrer MySQL zu erhalten
und
$nb
enthält die Ganzzahl, die Sie mit Ihrer MySQL-Anweisung gezählt haben, etwas lang zum Schreiben, aber schnell zum AusführenBearbeiten: Entschuldigung für den falschen Beitrag, aber als Beispiel für eine Abfrage mit Zählung in schlug ich vor, das MySQL-Ergebnis zu verwenden. Wenn Sie die Zählung in SQL nicht verwenden, ist fetchAll () effizient, wenn Sie das Ergebnis in einer Variablen speichern Sie werden keine Linie verlieren.
count($table)
gibt die Anzahl der Zeilen zurück und Sie können das Ergebnis nach like$row = $table[0]
oder using a weiterhin verwendenforeach
quelle
Hier ist eine maßgeschneiderte Erweiterung der PDO-Klasse mit einer Hilfsfunktion zum Abrufen der Anzahl der Zeilen, die in den "WHERE" -Kriterien der letzten Abfrage enthalten sind.
Je nachdem, welche Befehle Sie verwenden, müssen Sie möglicherweise weitere 'Handler' hinzufügen. Derzeit funktioniert es nur für Abfragen, die "FROM" oder "UPDATE" verwenden.
quelle
Sie können die beste Methode in einer Zeile oder Funktion kombinieren und die neue Abfrage automatisch für Sie generieren lassen:
quelle
quelle
quelle
Parameter verwenden
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, sonst -1 anzeigen:Usen parametro
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, sin ello sale -1Beispiel:
quelle