Bei Betriebsdatenbanken mit PHP ist PDO eine empfohlene Möglichkeit, eine einheitliche, flexible und sichere Schnittstelle bereitzustellen. Unter ihnen wird die Methode PDOSTATEMENT :: RowCount () häufig verwendet, um die Anzahl der von SQL -Operationen betroffenen Zeilen zu erhalten, verhält sich jedoch bei verschiedenen Anweisungstypen (z. B. auswählen , einfügen , aktualisieren , löschen ) etwas unterschiedlich. Dieser Artikel konzentriert sich darauf, wie häufiges Missverständnisse vermieden werden kann.
Normalerweise möchten wir wissen, wie viele Zeilen nach der Durchführung der Einfügungsoperation erfolgreich eingefügt werden, z. B.:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':name', 'Alice');
$stmt->bindValue(':email', '[email protected]');
$stmt->execute();
echo $stmt->rowCount(); // Erwartete Ausgabe:1
In den meisten Fällen gibt RowCount () die Anzahl der betroffenen Zeilen korrekt zurück (normalerweise 1), wenn eine einzelne Einfügungsanweisung ausgeführt wird. Wenn Sie sich jedoch für die Kompatibilität für Cross-Database interessieren, müssen Sie vorsichtig sein.
Für die folgenden Batch -Einfügungsanweisungen:
$sql = "INSERT INTO users (name, email) VALUES
('Bob', '[email protected]'),
('Charlie', '[email protected]')";
$stmt = $pdo->prepare($sql);
$stmt->execute();
echo $stmt->rowCount(); // existieren MySQL Als nächstes kehrt normalerweise zurück 2
Obwohl RowCount () wahrscheinlich 2 zurückgibt, wird dies nicht immer von allen Datenbanktreibern unterstützt , und in Postgresql, SQLite und anderen Datenbanken kann dieses Verhalten nicht verfügbar sein oder 0 zurückgeben.
Für einige Datenbanken wie PostgreSQL gibt RowCount () Werte für Anweisungen vom Typ Insert zurück.
Wenn Sie also RowCount () sicher verwenden möchten, um die Anzahl der eingefügten Zeilen in einer plattformübergreifenden Umgebung zu erhalten, stellen Sie sicher:
Verwenden Sie einen Datenbanktreiber (wie MySQL), der diese Funktion unterstützt.
Verwenden Sie Standardeinfügungsanweisungen, ohne sich auf den doppelten Schlüssel zu verlassen oder Klauseln zurückzugeben (es sei denn, die Datenbank unterstützt sie explizit).
Hier sind einige praktische Vorschläge:
Stellen Sie sicher, dass die aktuelle Umgebung MySQL- oder kompatible Treiber verwendet und der Rückgabewert von RowCount () aussagekräftig ist.
if ($pdo->getAttribute(PDO::ATTR_DRIVER_NAME) === 'mysql') {
echo "Erfolgreich einfügen,Anzahl der Zeilen beeinflussen:" . $stmt->rowCount();
} else {
echo "NEIN MySQL Datenbank,rowCount() Die Ergebnisse können ungenau sein";
}
Die meisten Fahrer unterstützen die Rückgabe einer betroffenen Anzahl von Zeilen von 1 für einen einzelnen Einsatz, was empfohlen wird.
$pdo->beginTransaction();
$total = 0;
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$data = [
['name' => 'David', 'email' => '[email protected]'],
['name' => 'Eve', 'email' => '[email protected]']
];
foreach ($data as $row) {
$stmt->execute($row);
$total += $stmt->rowCount();
}
$pdo->commit();
echo "Insgesamt einfügen $total OK";
Durch eine einzelne Insertion -Matching -Schleife können Sie sicherstellen, dass sich RowCount () unter jedem Treiber konsequent verhält.
Missverständnis | veranschaulichen |
---|---|
Alle Datenbanken glauben, dass RowCount () unterstützt wird, die Anzahl der eingefügten Zeilen zurückzugeben | Tatsächlich können PostgreSQL und SQLite 0 zurückgeben |
Vertrauen Sie RowCount () beim Einfügen der Stapel | Kann in nicht-mysql-Umgebungen ungenau sein |
Verwenden Sie RowCount (), um festzustellen, ob die Einfügung erfolgreich ist | Es ist besser, den Booleschen Rückgabewert von Execute () zu verwenden, um mit dem Fehlerbehandlungsmechanismus zusammenzuarbeiten |
Wenn Sie sich nur um die eingefügte Primärschlüssel -ID (insbesondere den automatischen Primärschlüssel) kümmern, können Sie verwenden:
$pdo->lastInsertId();
HINWEIS: Nur zum Einfügen einzelner Zeilen und Tabellen mit automatischen Primärschlüssel geeignet.
Pdostatement :: rowCount () ist ein leistungsstarkes Tool, das sich zwischen verschiedenen Datenbanken geringfügig verhält. Wenn Sie es verwenden, um die Anzahl der von einer Einfügung betroffenen Zeilen in die Anweisung zu erhalten, wird empfohlen:
Priorität wird in der MySQL -Umgebung verwendet.
Es ist sicherer, Transaktionen für die Stapelinsertion zu verwenden.
In Multi-Database-Szenarien sollten Sie in Betracht ziehen, datenbankspezifische Rückkehr oder andere Funktionen zu verwenden, um zu vermeiden, dass Sie auf RowCount () stützen.
Weitere Beispiele für PDO -Übungen finden Sie unter https://gitbox.net/docs/pdo .