毎日の開発では、データの削除は非常に一般的ですが、慎重な処理タスクが必要です。特に、大規模なデータ処理や実行効率を必要とするシナリオでは、削除操作が成功しているかどうか、および後続のロジックを実行し続ける必要があるかどうかを正確に判断することが特に重要です。この時点で、 pdostatement :: rowcount関数がその役割を果たすことができます。
pdostatement :: RowCountは、PDOがPHPでSQLを実行した後の方法であり、これは以前のSQLステートメントの影響を受けた行の数を返すために使用されます。削除、更新、挿入などのステートメントの場合、実際に変更または削除されたデータの行が正確に表示されることがわかります。
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "user", "password");
$stmt = $pdo->prepare("DELETE FROM users WHERE last_login < :threshold");
$stmt->execute([':threshold' => '2024-01-01']);
$deletedRows = $stmt->rowCount();
echo "合計で削除されます $deletedRows ラインレコード。";
この例では、ユーザーテーブルに基準を満たすレコードがある場合、 rowcount()は削除された行の数を返すことができます。
多くの場合、プログラムロジックで削除ステートメントを無条件に実行することもありますが、実際、データベースの条件を満たすレコードはない場合があります。この意味のない削除操作はエラーを報告しませんが、データベースの負担が増加します。
rowcount()を使用して、実行前後の後続のロジックを実行するかどうかを正確に決定します。
$stmt = $pdo->prepare("DELETE FROM logs WHERE created_at < :expired_time");
$stmt->execute([':expired_time' => date('Y-m-d H:i:s', strtotime('-30 days'))]);
if ($stmt->rowCount() > 0) {
// レコードが削除されました,後続のクリーニングタスクを実行できます
file_get_contents("https://gitbox.net/cleanup-notify");
}
レコードが実際に削除されているかどうかを判断することにより、不要なリモートコールまたはその他のリソース消費が回避されます。
大規模なバッチ削除操作を処理する場合、 Select Count(*)チェックを最初に使用する場合、2つのデータベースアクセスが必要になる場合があります。 RowCount()は、実行後に影響を受ける行の数をすぐに与えることができ、クエリのオーバーヘッドを保存できます。
$stmt = $pdo->prepare("DELETE FROM temp_data WHERE expire_at < NOW()");
$stmt->execute();
if ($stmt->rowCount() === 0) {
echo "削除されるデータはありません。";
} else {
echo "正常に削除されました {$stmt->rowCount()} 一時的なデータ。";
}
この方法は、作業の不必要な繰り返しを避けるために、時限クリーニングスクリプトで記述するのに特に適しています。
データベース操作を実行する場合、影響を受ける行の数を記録することは、トラブルシューティングとパフォーマンス監視に不可欠です。 RowCount()の返品値を使用して、詳細なログを構築して、パフォーマンスボトルネックまたは論理エラーを見つけるのに役立ちます。
$logMessage = sprintf(
"[%s] クリーニング操作が完了しました,合計で削除します %d 期限切れの注文。",
date('Y-m-d H:i:s'),
$stmt->rowCount()
);
error_log($logMessage, 3, '/var/log/cleanup.log');
RowCount()はほとんどのデータベースでうまく機能しますが、選択されたステートメントでは常に機能するとは限りません。一部のデータベースドライバーでは、 SELECTステートメントでrowCount()を呼び出すと0が返されるため、挿入、削除、更新などの書き込み操作にのみ使用する必要があります。