當前位置: 首頁> 最新文章列表> 如何正確使用PDOStatement::rowCount 獲取INSERT INTO 語句的影響行數

如何正確使用PDOStatement::rowCount 獲取INSERT INTO 語句的影響行數

gitbox 2025-05-28

在使用PHP 操作數據庫時, PDO是一種推薦的方式,它提供了統一、靈活且安全的接口。其中, PDOStatement::rowCount()方法常用於獲取SQL 操作影響的行數,但它在不同的語句類型(如SELECTINSERTUPDATEDELETE )中的行為略有不同。本文重點講解如何,避免常見的誤區。

一、rowCount() 對INSERT 的適用性

通常我們希望在執行插入操作後,知道有多少行被成功插入,比如:

 $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(); // 預期輸出:1

在大多數情況下,特別是使用MySQL時,如果執行的是單條INSERT語句, rowCount()會正確返回影響的行數(通常為1)。但如果你在意跨數據庫兼容性,就需要小心。

二、批量插入時的rowCount 行為

對於如下批量插入語句:

 $sql = "INSERT INTO users (name, email) VALUES 
        ('Bob', '[email protected]'), 
        ('Charlie', '[email protected]')";
$stmt = $pdo->prepare($sql);
$stmt->execute();

echo $stmt->rowCount(); // 在 MySQL 下通常返回 2

雖然rowCount()很可能會返回2,但這並不總是被所有數據庫驅動支持,在PostgreSQL、SQLite 等數據庫中,該行為可能不可用或返回0。

官方文檔提示:

對於某些數據庫,如PostgreSQL, rowCount()INSERT類型的語句返回值不可靠。

所以,如果你想在跨平台環境中穩妥使用rowCount()獲取插入行數,請確保:

  • 使用支持該功能的數據庫驅動(如MySQL)。

  • 使用標準的INSERT 語句,不依賴ON DUPLICATE KEY 或RETURNING 子句(除非數據庫明確支持)。

三、如何更穩妥地獲取插入影響的行數?

以下是一些實用建議:

1. 確保使用的是PDO + MySQL

確認當前環境使用的是MySQL 或兼容的驅動,且rowCount()的返回值有意義。

 if ($pdo->getAttribute(PDO::ATTR_DRIVER_NAME) === 'mysql') {
    echo "插入成功,影響行數:" . $stmt->rowCount();
} else {
    echo "非 MySQL 資料庫,rowCount() 結果可能不准確";
}

2. 對於單行插入,用rowCount() 是安全的

大多數驅動都支持對單條INSERT 返回受影響行數為1,這是推薦做法。

3. 對於多行插入,推薦用事務配合循環

$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 "共插入 $total 行";

通過單條插入配合循環,可以確保rowCount()在各驅動下行為一致。

四、常見誤區匯總

誤區說明
認為所有數據庫都支持rowCount()返回插入行數實際上PostgreSQL、SQLite 可能返回0
批量插入時信賴rowCount()在非MySQL 環境下可能不准確
使用rowCount()判斷是否插入成功不如使用execute()的布爾返回值配合錯誤處理機制

五、替代方案:使用LAST_INSERT_ID()

如果你只關心插入的主鍵ID(尤其是自增主鍵),可以用:

 $pdo->lastInsertId();

注意:只適用於插入單行且表存在自增主鍵。

六、總結

PDOStatement::rowCount()是一個強大但在不同數據庫間行為略有不同的工具。在使用它來獲取INSERT INTO語句的影響行數時,建議:

  • 優先在MySQL 環境下使用。

  • 對批量插入使用事務配合循環,更加穩妥。

  • 在多數據庫場景中,應考慮使用數據庫特有的RETURNING或其他特性,避免依賴rowCount()

如需查看更多PDO 的實踐示例,可訪問https://gitbox.net/docs/pdo