Wie so oft ist diese Frage höllisch verwirrend. Die Leute kommen hierher und haben zwei verschiedene Aufgaben :
- Sie müssen wissen, wie viele Zeilen in der Tabelle enthalten sind
- Sie müssen wissen, ob eine Abfrage Zeilen zurückgegeben hat
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
Vor der Verwendung von PDO habe ich einfach verwendet mysql_num_rows()
.
Bedeutet, dass du es schon falsch gemacht hast. Das Verwenden mysql_num_rows()
oder rowCount()
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:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
Wenn Sie viele Zeilen benötigen, können Sie verwenden fetchAll()
.
fetchAll()
ist etwas, das ich nicht will, da ich manchmal mit großen Datenmengen zu tun habe
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()
noch fetchAll()
.
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 bekommen LIMIT
, WHERE
oder eine ähnliche Klausel in der SQL. Und für eine so moderate Datenmenge ist es in Ordnung, sie zu verwenden fetchAll()
. Und wieder verwenden Sie einfach das Ergebnis dieser Funktion in der Bedingung:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
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.