Aktueller Standort: Startseite> Neueste Artikel> Pdostatement :: RowCount -Verhalten ist unter verschiedenen Datenbanktreibern inkonsistent. Wie geht es damit um?

Pdostatement :: RowCount -Verhalten ist unter verschiedenen Datenbanktreibern inkonsistent. Wie geht es damit um?

gitbox 2025-05-28

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.

1. Offizielle Beschreibung von RowCount

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.

2. Verschiedenes Verhalten von Hauptdatenbanken der Hauptmainstreams

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.

3. Warum ist dieser Unterschied?

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.

4. Wie sollte es behandelt werden?

1. Für ausgewählte Abfrage: Verwenden Sie Fetchall () oder Schleifenzahl

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

2. Für Update/Löschen/Einfügen kann RowCount sicher verwendet werden

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

3. Für die Kompatibilität für die Cross-Database-Kompatibilität können Sie eine Schicht der RowCount-Methode einkapitulieren

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.

V. Schlussfolgerung

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 .