Aktueller Standort: Startseite> Neueste Artikel> Warum Pdostatement :: RowCount in einigen Datenbanktreibern nicht unterstützt wird

Warum Pdostatement :: RowCount in einigen Datenbanktreibern nicht unterstützt wird

gitbox 2025-05-28

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.

1. Die Funktion und Verwendung von RowCount

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

2. Warum kehrt RowCount 0 zurück. Wenn Sie Abfrage auswählen?

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.

3. Verhaltensweisen Verhaltensweisen des Datenbanktreibers

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.

4. Empfohlene Praktiken und Vorsichtsmaßnahmen

  1. 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.

  2. 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.

  3. 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';

5. Zusammenfassung

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