In der Datenbankabstraktionschicht von PHP (PHP -Datenobjekte) ist Pdostatement :: rowCount () eine gemeinsame Methode, die die Anzahl der von der letzten SQL -Ausführung betroffenen Zeilen zurückgibt. Viele Entwickler werden jedoch feststellen, dass das Methodenverhalten bei der Verwendung in verschiedenen Datenbanktreibern inkonsistent ist und in einigen Szenarien sogar die erwarteten Ergebnisse nicht erzielt.
Nach den Anweisungen der offiziellen PHP -Dokumentation :
Für die meisten Datenbanken gilt RowCount () nur zum Löschen , Einfügen oder Aktualisieren von Anweisungen. Für ausgewählte Aussagen können einige Datenbanktreiber die Anzahl der betroffenen Zeilen zurückgeben, dies ist jedoch nicht Teil des einheitlichen PDO -Verhaltens.
Das Verhalten von RowCount () hängt von der zugrunde liegenden Datenbanktreiberimplementierung ab.
Datenbanktyp | Unterstützen Sie RowCount für ausgewählte Aussagen | Unterstützen Sie RowCount für Update/Löschen/Einfügen |
---|---|---|
Mysql | ? Unzuverlässig (normalerweise return 0) | ? Gibt die Anzahl der betroffenen Zeilen zurück |
PostgreSQL | ? Unterstützung | ? Unterstützung |
Sqlite | ? Unterstützung | ? Unterstützung |
MSSQL | ? (Abhängigkeitstreiber -Implementierung) | ? |
Zum Beispiel in MySQL:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->query("SELECT * FROM users");
echo $stmt->rowCount(); // Normalerweise kehren Sie zurück 0
In Postgresql oder SQLite kann die tatsächliche Anzahl der Zeilen zurückgegeben werden.
Der Hauptgrund ist, dass der Datenbanktreiber SQL auf unterschiedliche Weise ausführt, insbesondere für Select . Einige Treiber laden nicht alle Ergebnisse im Voraus, sondern holen stattdessen Daten beim Durchlaufen. In diesem Fall kann es nicht wissen, wie viele Zeilen es im Voraus gibt.
Der offizielle MySQL -Treiber ( MySQLND ) besagt deutlich, dass RowCount () nicht abhängig sein sollte.
$stmt = $pdo->query("SELECT * FROM users");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$count = count($rows);
echo "gemeinsam {$count} Zeilendaten";
oder:
$count = 0;
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch()) {
$count++;
}
echo "gemeinsam {$count} Zeilendaten";
HINWEIS: Wenn das Datenvolumen groß ist, wird Fetchall () viel Speicher belegen und es wird empfohlen, die Schleifenzählung zu verwenden.
$stmt = $pdo->prepare("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 7 DAY");
$stmt->execute();
echo "Aktualisiert " . $stmt->rowCount() . " OK";
RowCount () für solche Operationen ist normalerweise zuverlässig.
Sie können Ihre eigene RowCount -Funktion zusammenschließen, den SQL -Typ beurteilen und die entsprechende statistische Methode auswählen:
function safeRowCount(PDOStatement $stmt, $sqlType = 'SELECT') {
if (strtoupper($sqlType) === 'SELECT') {
return count($stmt->fetchAll());
} else {
return $stmt->rowCount();
}
}
Auf diese Weise können Sie Ihr Verhalten in verschiedenen Datenbanktreibern konsistent halten.
Das inkonsistente Verhalten von Pdostatement :: RowCount () ist eine der häufigsten Fallstricke in der Entwicklung der PHP -Datenbank. Das Verständnis des zugrunde liegenden Mechanismus und die Auswahl der entsprechenden Verarbeitungsmethode basierend auf SQL -Typen ist der Schlüssel zum Schreiben von hochkompatiblen Code.
Weitere Beispiele für Beispielcode oder Freigabe finden Sie in unserer Technologie -Community: https://gitbox.net/forum .
Verwandte Tags:
PDOStatement