當前位置: 首頁> 最新文章列表> 如何通過PDOStatement::rowCount 獲取影響的行數進行條件判斷

如何通過PDOStatement::rowCount 獲取影響的行數進行條件判斷

gitbox 2025-05-28

在使用PHP 操作數據庫時,我們經常需要知道某條SQL 語句執行後究竟影響了多少行數據。比如,在執行UPDATEDELETE或某些INSERT操作時,了解受影響的行數有助於我們判斷操作是否成功,或者是否需要進行下一步處理。

這時, PDOStatement::rowCount()函數就派上用場了。本文將介紹如何使用rowCount()方法,並結合實際代碼示例演示如何根據返回的行數進行條件判斷。

一、什麼是PDOStatement::rowCount()

rowCount()是PDOStatement 類的一個方法,用於返回最後一次執行的SQL 語句所影響的行數。這個函數的返回值通常用於判斷數據是否真正被更新或刪除。

 public int PDOStatement::rowCount();

注意: rowCount()在不同數據庫驅動下的行為可能略有不同,尤其是用於SELECT查詢時可能不返回預期結果。

二、基本使用方法

以下是一個更新數據庫中用戶信息的示例。在執行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();
}
?>

三、常見場景與使用技巧

1. 刪除操作後確認刪除數量

$sql = "DELETE FROM users WHERE last_login < NOW() - INTERVAL 1 YEAR";
$stmt = $pdo->prepare($sql);
$stmt->execute();

if ($stmt->rowCount() > 0) {
    echo "已成功刪除不活躍用戶。";
} else {
    echo "沒有找到需要刪除的用戶。";
}

2. 批量插入後檢查是否插入成功

某些數據庫(如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 "日誌寫入失敗或不完整。";
}

四、注意事項

  1. 對於SELECT 查詢,rowCount() 行為不確定:通常建議配合fetchAll()fetch()來判斷是否有結果。

  2. 使用正確的數據庫驅動:有些數據庫(如SQLite)在某些操作中對rowCount()的支持有限。

  3. 不要誤認為rowCount() 是執行成功的唯一標誌:它只表示“受影響的行數”,並不等於“操作成功”,因為更新相同的數據可能不會改變行數。