首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP MySQL UPDATE 執行成功判斷:mysql_affected_rows 正確用法與陷阱避坑

     編輯:PHP 綜合知識

核心函式


返回值:

  • >= 0:影響行數 (含 0 行)
  • -1:SQL 錯誤或最後操作非 INSERT/UPDATE/DELETE

正確判斷邏輯

query($sql);
$affected = $mysqli->affected_rows;

if ($affected === -1) {
    die('SQL Error: ' . $mysqli->error); // 執行失敗
} elseif ($affected > 0) {
    echo "更新成功,影響 $affected 行";
} else {
    echo "更新執行成功,但無資料變更 (0 行受影響)";
}
?>

常見誤區

錯誤寫法問題正確寫法
if ($mysqli->query($sql))只判斷語法執行成功,不代表有資料變更必須檢查 affected_rows
if ($affected)0 行時進入 else,誤判為失敗if ($affected === -1) 判斷錯誤,>=0 皆為執行成功
SELECT 後用 affected_rows返回 -1用 num_rows
事務中多條 UPDATE只返回最後一條需逐條檢查或用 $mysqli->info

PDO 版本

prepare("UPDATE users SET status = 1 WHERE id = ?");
$stmt->execute([123]);
$affected = $stmt->rowCount(); // PDOStatement::rowCount

if ($affected > 0) {
    echo "更新成功";
} elseif ($affected === 0) {
    echo "無資料變更";
}
// PDO 執行失敗會拋出 Exception (預設 ERRMODE_EXCEPTION)
?>

進階:REPLACE / INSERT ... ON DUPLICATE KEY UPDATE

query($sql);
echo $mysqli->affected_rows; // 1=新增, 2=更新
?>

批次更新效能

 $id) {
    $sql .= "WHEN $id THEN $statuses[$i] ";
}
$sql .= "END WHERE id IN (" . implode(',', $ids) . ")";

$mysqli->query($sql);
echo $mysqli->affected_rows; // 返回總影響行數
?>

總結

  • affected_rows >= 0 代表執行成功 (含 0 行)
  • affected_rows === -1 代表 SQL 錯誤
  • 必須區分「執行成功」與「有資料變更」
  • PDO 使用 rowCount(),行為一致
  • 事務、批次、觸發器場景下行數語義可能不同,需實測確認
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved