PHPを使用してデータベースを操作する場合、SQLステートメントの実行後に影響するデータの数を知る必要があることがよくあります。たとえば、更新、削除、または一部の挿入操作を実行する場合、影響を受ける行の数を理解すると、操作が成功したかどうか、次のステップが必要かどうかを判断するのに役立ちます。
この時点で、 pdostatement :: rowcount()関数は役立ちます。この記事では、RowCount()メソッドを使用する方法を紹介し、実際のコード例と組み合わせて、返された行の数に基づいて条件付き判断を下す方法を示す方法について説明します。
RowCount()は、最後に実行されたSQLステートメントの影響を受けた行の数を返すPDOSTATEMENTクラスの方法です。この関数の返品値は、通常、データが実際に更新されるか削除されているかを判断するために使用されます。
public int PDOStatement::rowCount();
注: rowCount()は、特に選択したクエリに使用される場合、予想される結果を返さない場合は、異なるデータベースドライバーでわずかに異なる動作をする場合があります。
以下は、データベース内のユーザー情報を更新する例です。 SQLを実行した後、 rowCount()を使用して、データが実際に変更されたかどうかを判断します。
<?php
// データベース接続情報
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';
$username = 'dbuser';
$password = 'dbpass';
try {
// 作成する PDO 例
$pdo = new PDO($dsn, $username, $password);
// 例外エラー処理を設定します
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 準備する SQL 更新ステートメント
$sql = "UPDATE users SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
// バインドパラメーター
$stmt->bindValue(':email', '[email protected]');
$stmt->bindValue(':id', 1);
// 実わかりましたステートメント
$stmt->execute();
// 影響を受けるわかりましたの数を取得します
$affectedRows = $stmt->rowCount();
// 条件付き判断
if ($affectedRows > 0) {
echo "ユーザー情報が更新されました,総影響 {$affectedRows} わかりました。";
} else {
echo "ユーザー情報は変更されていません,おそらくデータが変更されていないためです。";
}
} catch (PDOException $e) {
echo "データベースエラー:" . $e->getMessage();
}
?>
$sql = "DELETE FROM users WHERE last_login < NOW() - INTERVAL 1 YEAR";
$stmt = $pdo->prepare($sql);
$stmt->execute();
if ($stmt->rowCount() > 0) {
echo "非アクティブなユーザーが正常に削除されました。";
} else {
echo "削除されるユーザーは見つかりませんでした。";
}
一部のデータベース(MySQLなど)により、バッチ挿入後にrowCount()を返すことができます。
$sql = "INSERT INTO logs (message, created_at) VALUES
('動作します1', NOW()),
('動作します2', NOW())";
$stmt = $pdo->prepare($sql);
$stmt->execute();
if ($stmt->rowCount() >= 2) {
echo "ログはバッチで書かれています。";
} else {
echo "ログ書き込みは失敗または不完全です。";
}
選択したクエリの場合、rowCount()の動作は不確かです。通常、 fetchall()またはfetch()を使用して結果があるかどうかを判断することをお勧めします。
正しいデータベースドライバーを使用する:一部のデータベース(SQLiteなど)は、一部の操作でrowCount()のサポートが限られています。
rowcount()を実行の成功の唯一の兆候と間違えないでください:「影響を受ける行の数」のみを意味し、同じデータを更新することで行数が変更されないため、「操作の成功」と等しくありません。