萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

如何判斷 MySQL UPDATE 是否真正修改了數據?mysqli_affected_rows 實戰

常見誤區

$sql = "UPDATE a SET aname='名字' WHERE aid=88";
$r = $conn->query($sql);
if ($r) {
    echo "以為更新成功了";
}

$conn->query() 返回 true 只代表語句執行無語法錯誤,即使 WHERE 條件無匹配行(如 aid=88 不存在),也返回 true。

正確做法:檢查受影響行數

$sql = "UPDATE a SET aname='名字' WHERE aid=88";
$r = $conn->query($sql);
if ($r) {
    $affected = $conn->affected_rows;  // mysqli
    // 或 $affected = mysqli_affected_rows($conn);
    // PDO: $stmt->rowCount()
    if ($affected > 0) {
        echo "真正更新了 $affected 行";
    } else {
        echo "語句執行成功,但無數據變更(條件不匹配或值相同)";
    }
}

關鍵差異

  • affected_rows > 0:有行被實際修改(舊值 ≠ 新值)。
  • affected_rows = 0:無行匹配,或新值等於舊值(MySQL 優化:不更新相同值)。
  • matched_rows(需 mysqli_info 或 ROW_COUNT()):匹配 WHERE 條件的行數,即使值未變也計入。

完整示例(含錯誤處理)

$mysqli = new mysqli("localhost", "user", "pass", "db");
if ($mysqli->connect_errno) die("Connect failed: " . $mysqli->connect_error);

$sql = "UPDATE users SET name='NewName' WHERE id=999";
if (!$mysqli->query($sql)) {
    die("SQL Error: " . $mysqli->error);
}

if ($mysqli->affected_rows > 0) {
    echo "成功更新 {$mysqli->affected_rows} 行";
} else {
    echo "無數據更新(ID 不存在或名稱相同)";
}
$mysqli->close();
copyright © 萬盛學電腦網 all rights reserved