在使用PHP 操作數據庫時,我們經常需要知道某條SQL 語句執行後究竟影響了多少行數據。比如,在執行UPDATE 、 DELETE或某些INSERT操作時,了解受影響的行數有助於我們判斷操作是否成功,或者是否需要進行下一步處理。
這時, PDOStatement::rowCount()函數就派上用場了。本文將介紹如何使用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();
}
?>
$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 "日誌寫入失敗或不完整。";
}
對於SELECT 查詢,rowCount() 行為不確定:通常建議配合fetchAll()或fetch()來判斷是否有結果。
使用正確的數據庫驅動:有些數據庫(如SQLite)在某些操作中對rowCount()的支持有限。
不要誤認為rowCount() 是執行成功的唯一標誌:它只表示“受影響的行數”,並不等於“操作成功”,因為更新相同的數據可能不會改變行數。