In PHP wird die Pdostatement :: RowCount -Methode verwendet, um die Anzahl der betroffenen Zeilen zu erhalten. Diese Methode wird normalerweise verwendet, um zu überprüfen, wie viele Datenzeilen die Operation nach Ausführung von SQL -Anweisungen wie Einfügen , Aktualisieren oder Löschen beeinflusst. Manchmal gibt RowCount jedoch eine andere Anzahl von Zeilen zurück als erwartet. Diese Situation kann durch mehrere Faktoren verursacht werden, und dieser Artikel wird einige häufige Gründe im Detail einführen.
Für ausgewählte Aussagen kann das Verhalten von RowCount je nach Datenbanktreiber und Datenbankverwaltungssystem (DBMS) variieren. Zum Beispiel:
MySQL : Für ausgewählte Abfragen gibt RowCount nicht immer die tatsächliche Anzahl von Zeilen zurück. Normalerweise gibt es nur die geänderte Anzahl von Zeilen nach Anweisungen wie Löschen , Aktualisieren usw. zurück, während in einer Auswahlabfrage nur dann 0 oder 1 zurückgegeben wird, selbst wenn tatsächlich mehrere Datenzeilen zurückgegeben werden. Um die reale Anzahl von Zeilen zu erhalten, müssen Sie die Funktion Fetchall oder Count verwenden.
PostgreSQL : Für ausgewählte Anweisungen gibt RowCount die tatsächliche Anzahl der betroffenen Zeilen zurück.
Wenn Sie also Abfragen in Ihrem Code auswählen , überprüfen Sie, ob Ihr Datenbank Typ und Treiber diese Funktion unterstützen.
Verschiedene Datenbankmotoren können die Anzahl der von RowCount zurückgegebenen Zeilen beeinflussen. Wenn Sie beispielsweise die InnoDB -Engine in MySQL verwenden , kann RowCount einen Wert von mehr als 0 zurückgeben, selbst wenn tatsächlich keine Zeilen gelöscht werden. Dies liegt daran, dass InnoDB diese Verhaltensweisen zum Entfernen markiert, anstatt sie vollständig zu löschen. Tatsächliche physische Löschvorgänge treten normalerweise irgendwann in der Zukunft auf.
In diesem Fall kann die Anzahl der zurückgegebenen Zeilen überprüft werden, indem die tatsächlichen Daten per Select abfragen.
Wenn Sie in einer Transaktion einige Vorgänge für die Daten durchgeführt haben und die Transaktion nicht begangen haben, kann RowCount die Anzahl der vom Betrieb betroffenen Zeilen nicht korrekt zurückgeben. Der Grund dafür ist, dass die Transaktion nicht vollständig festgelegt ist und die Datenbank diese Änderungen nicht dauerhaft aufgezeichnet hat. In diesem Fall ist es am besten, die RowCount -Methode nach der Verpflichtung der Transaktion aufzurufen, um sicherzustellen, dass die korrekte Anzahl von Zeilen erhalten wird.
Einige Datenbanksysteme ermöglichen das Abfragen zwischen den Abfragen. Selbst wenn Vorgänge wie Einfügen , Aktualisieren oder Löschen durchgeführt werden, kann RowCount die Daten im Cache anstelle der neuesten Zeilenzahl zurückgeben. Dies ist besonders wichtig bei der Verwendung von Richtlinien.
Wenn Sie den Cache -Mechanismus verwenden, müssen Sie den Cache möglicherweise nach der Ausführung des Vorgangs löschen oder darauf warten, dass der Cache aktualisiert wird, um sicherzustellen, dass RowCount die richtige Anzahl von Zeilen zurückgibt.
Manchmal können Änderungen im SQL -Anweisungsoptimierungs- oder Ausführungsplan dazu führen, dass RowCount nicht mit den Erwartungen in Einklang gebracht wird. Beispielsweise können einige Abfragen auf effizientere Weise optimiert werden, wodurch die Anzahl der Zeilen reduziert wird, die Sie tatsächlich ohne Änderung betrieben haben.
Wenn Sie Limit oder Offset in einer Auswahlabfrage verwenden, kann RowCount nur die begrenzte Anzahl von Zeilen zurückgeben, nicht alle Zeilen der Abfrage. Zum Beispiel:
$stmt = $pdo->prepare("SELECT * FROM users LIMIT 10");
$stmt->execute();
echo $stmt->rowCount(); // Die Rückkehr kann sein0,Stattdessen10
Um dies zu vermeiden, sollten Sie Fetchall verwenden, um alle Daten zu erhalten, nachdem Sie die Abfrage tatsächlich ausgeführt haben, und dann die Anzahl der Zeilen berechnen, anstatt sich auf RowCount zu verlassen.
In einigen Fällen kann die Ausführung von RowCount bei Verwendung von Vorverarbeitungsanweisungen unterschiedliche Ergebnisse zurückgeben. Insbesondere wenn Variablen gebunden sind und die Datenbankmotor bestimmte Optimierungen unterstützt, ist der von RowCount zurückgegebene Wert möglicherweise nicht wie erwartet.
$stmt = $pdo->prepare("UPDATE users SET status = 'inactive' WHERE last_login < :time");
$stmt->bindParam(':time', $time);
$stmt->execute();
echo $stmt->rowCount(); // Die Rendite stimmt möglicherweise nicht mit den Erwartungen überein
Schließlich können einige Datenbanktreiber (wie MySQL oder PostgreSQL ) selbst Probleme oder Einschränkungen im Zusammenhang mit RowCount haben. Bei der Verwendung dieser Treiber ist es am besten, die Dokumentation zu konsultieren, um zu verstehen, wie der Datenbanktreiber den Rückgabewert von RowCount bei der Durchführung eines bestimmten Vorgangs umgeht.