Bei der Verwendung von PHP -PDO (PHP -Datenobjekte) zum Betrieb einer Datenbank ist PDOSTATEMENT :: RowCount () eine Methode, mit der häufig die Anzahl der Zeilen erhalten wird, die der Betrieb beeinflusst. Viele Entwickler haben jedoch in der tatsächlichen Entwicklung festgestellt, dass sein Verhalten zwischen verschiedenen Datenbanken erheblich variiert. In diesem Artikel wird die Leistung von RowCount () in verschiedenen Datenbanken und die wichtigsten Punkte, auf die Sie bei der Verwendung achten sollten, eingehend analysiert.
In PDO wird die RowCount () -Methode normalerweise verwendet, um die Anzahl der von der vorherigen SQL -Anweisung betroffenen Zeilen zurückzugeben. Dies ist normalerweise genau und gültig für Aktualisierung , Löschen und Einfügen von Anweisungen. Für ausgewählte Abfragen variiert sein Verhalten jedoch je nach Datenbanktreiber.
Beispiel:
<?php
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "user", "pass");
$stmt = $pdo->prepare("UPDATE users SET active = 1 WHERE last_login > :date");
$stmt->execute([':date' => '2024-01-01']);
echo $stmt->rowCount() . " rows updated.";
?>
Update/Löschen/Einfügen : RowCount () gibt die Anzahl der betroffenen Zeilen zurück, was genau und gültig ist.
SELECT : Standardmäßig gibt rowCount () den Wert von 0 zurück, da MySQL -Treiber nicht unterstützt, dass die Zeilenzahlen zurückgegeben werden, um Aussagen auszuwählen .
Für alle Aussagen, einschließlich ausgewählten , kann RowCount () normalerweise die korrekte Anzahl von Zeilen zurückgeben.
Für die meisten Szenarien geeignet, aber einige Ansichten oder Funktionen können Verhaltensinstabilität verursachen.
Ähnlich wie bei MySQL ist das Update , einfügen , die Unterstützung löschen .
0 wird normalerweise für ausgewählte Anweisungen zurückgegeben.
Alle Arten von Aussagen werden unterstützt, die Anzahl der betroffenen Zeilen zurückzugeben, einschließlich Auswahl , jedoch nur, wenn der SQL -Server korrekt konfiguriert ist und bei der Ausführung der Anweisung nicht eingestellt wird.
Verlassen Sie sich nicht auf RowCount von Select ()
Sofern Sie den Datenbank -Treiber -Unterstützung nicht klar kennen, wird empfohlen, Fetchall () zu verwenden und dann Count () zu verwenden, um die Anzahl der Reisen zu erhalten.
$stmt = $pdo->query("SELECT * FROM users");
$rows = $stmt->fetchAll();
echo count($rows) . " rows selected.";
Versuchen Sie, Execute nach RowCount zu verwenden
Die Kombination von Vorbereitung und Ausführung kann sicherstellen, dass RowCount () die genaue Anzahl von Zeilen in der unterstützten Datenbank zurückgibt.
Das Verhalten in einer Transaktion kann unterschiedlich sein
Einige Datenbanken spiegeln die Anzahl der Zeilen in einer Transaktion erst sofort wider, wenn die Transaktion festgelegt ist.
Eingeschränkt durch Antriebsumsetzung
PDO selbst ist eine einheitliche Schnittstelle, und das zugrunde liegende Verhalten hängt vom verwendeten Treiber ab (wie PDO_MYSQL , PDO_PGSQL usw.).
Auswirkungen auf den Einsatz ignorieren/auf doppelter Schlüssel
Für diese Aussagen in MySQL ist der Rückgabewert von RowCount () nicht unbedingt die Anzahl der Einsätze, die Sie erwarten, sondern möglicherweise 0.
Pdostatement :: rowCount () ist eine bequeme Funktion, aber sein Verhalten über Datenbanken hinweg ist inkonsistent, insbesondere in ausgewählten Abfragen, die mit Vorsicht verwendet werden müssen. Beim Erstellen von plattformübergreifenden oder Anwendungen, die eine hohe Kompatibilität erfordern, sollten Sie es vermeiden, ihr Verhalten in ausgewählten und verwenden Alternativen wie Fetchall () + count () zu stützen.
<?php
$pdo = new PDO("mysql:host=localhost;dbname=demo", "user", "pass");
$stmt = $pdo->prepare("SELECT * FROM articles WHERE status = :status");
$stmt->execute([':status' => 'published']);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "gesamt " . count($results) . " Aufzeichnen。\n";
foreach ($results as $row) {
echo $row['title'] . " - Link: https://gitbox.net/article/" . $row['id'] . "\n";
}
?>
Durch die oben genannten Methoden können Abfrageergebnisse sicherer und plattformübergreifender verarbeitet werden, ohne sich über die Probleme zu sorgen, die durch Datenbankunterschiede in RowCount () verursacht werden.