Bei der Verwendung von PDO -Erweiterungen von PHP (PHP -Datenobjekte) zum Betrieb von Datenbanken verlassen sich Entwickler häufig auf die Methode Pdostatement :: RowCount (), um die Anzahl der betroffenen Zeilen zu erhalten. Viele Menschen werden jedoch in der tatsächlichen Entwicklung feststellen, dass diese Methode nicht das richtige Ergebnis in einigen Datenbanktreibern zurückgibt und sogar bei der Ausführung ausgewählter Abfragen 0 direkt zurückgibt. Warum ist das? Dieser Artikel wird dieses Problem eingehend analysieren.
Pdostatement :: rowCount () ist eine von PDO bereitgestellte Methode, um die Anzahl der von der zuletzt ausgeführten SQL -Anweisung betroffenen Zeilen zurückzugeben. Es wird am häufigsten in zwei Arten von SQL -Operationen verwendet:
Aktualisieren , löschen , einfügen usw. werden Datenoperationen ändern
Wählen Sie Abfrage (einige Treiberunterstützung)
Basisnutzungsbeispiele:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->prepare("DELETE FROM users WHERE status = :status");
$stmt->execute([':status' => 'inactive']);
echo $stmt->rowCount(); // Die Anzahl der betroffenen Zeilen ausgeben
Laut offizieller Dokumentation unterstützt RowCount () nicht die Rückgabe der Anzahl der betroffenen Zeilen, um Abfragen in einigen Datenbanktreibern auszuwählen . Das typischste Beispiel ist MySQL. Wenn der PDO -Treiber von MySQL verwendet wird, gibt es nach Ausführung einer Auswahlabfrage die Aufruf von RowCount () normalerweise anstelle der erwarteten Anzahl von Ergebnissen zurück.
Der Grund ist : Für ausgewählte Abfragen informiert die Client -Bibliothek von MySQL die Anzahl der betroffenen Zeilen nicht, es sei denn, sie wird mit MySQLND -Treiber verwendet (standardmäßig in PHP 5.3+ aktiviert). Trotzdem kann man sich nicht ganz auf RowCount () verlassen.
Wenn Sie wirklich die Anzahl der ausgewählten Abfragergebnisse erhalten müssen, besteht eine sicherere Möglichkeit, Fetchall () zu verwenden und dann zu zählen , um zu zählen:
$stmt = $pdo->query("SELECT * FROM users WHERE status = 'active'");
$results = $stmt->fetchAll();
echo count($results);
Dies verbraucht jedoch mehr Speicher, sorgt jedoch für Genauigkeit.
Im Folgenden sind die Unterstützungssituationen von RowCount () in mehreren gängigen Datenbanken aufgeführt:
Datenbank | Wird ausgewählt unterstützt? Verwenden Sie RowCount () |
---|---|
Mysql | ? Normalerweise nicht unterstützt (es sei denn, MySQLND) |
PostgreSQL | ? Unterstützung |
Sqlite | ? Wählen Sie die Abfrage aus normalerweise nicht unterstützt |
MSSQL/SQLSRV | ? Unterstützung |
Orakel | ? Unterstützung |
Wenn Sie RowCount () verwenden, sollten Sie daher ein Urteilsvermögen basierend auf der Zieldatenbank fällen.
Vermeiden Sie es, sich auf RowCount () zu verlassen, um festzustellen, ob die Auswahlabfrage Ergebnisse erzielt. Verwenden Sie am besten Fetch () oder Fetchall (), um festzustellen, ob ein Ergebnis darauf basiert, ob die Daten zurückgegeben werden.
In Löschen/Update/Einfügen ist RowCount () normalerweise zuverlässig. Solange die Abfrage erfolgreich ist, kann sie normalerweise die Anzahl der betroffenen Zeilen zurückgeben.
Stellen Sie sicher, dass Sie RowCount () verwenden, um die Auswahlmenge zu erhalten, wenn MySQLND (MySQL Native Treiber) aktiviert ist.
Sie können phpinfo () verwenden oder den folgenden Code ausführen, um festzustellen, ob Sie MySQLND verwenden:
echo phpinfo();
oder:
echo (extension_loaded('mysqlnd')) ? 'mysqlnd loaded' : 'mysqlnd not loaded';
Pdostatement :: rowCount () , obwohl eine bequeme Methode, ihr Verhalten von der Unterstützung des zugrunde liegenden Datenbanktreibers abhängt. Um die Kompatibilität des Codes für die Cross-Database zu gewährleisten, wird empfohlen, RowCount () bei Verwendung ausgewählter Abfragen zu vermeiden und stattdessen eine stabilere und zuverlässigere Möglichkeit zu verwenden, um die Anzahl der Datenzeilen zu beurteilen.
Weitere datenbankbezogene Tutorials finden Sie unter: https://gitbox.net/dev/database-tutorials