執行 UPDATE 語句時,若 WHERE 條件匹配行但字段值實際未變更,mysql_affected_rows() 返回 0,而非匹配行數。這導致無法區分「未匹配到行」與「匹配但值相同」兩種情況。
mysql_affected_rows()返回上一條INSERT、UPDATE、DELETE影響的行數。對於UPDATE,若新值與舊值相同,MySQL 不會更新行,故返回 0。
mysql_modified_rows()function mysql_modified_rows() {
$info = mysql_info(); // 返回如 "Rows matched: 5 Changed: 0 Warnings: 0"
$affected = mysql_affected_rows();
if (preg_match('/Rows matched: ([0-9]+)/', $info, $m)) {
$matched = (int)$m[1];
} else {
$matched = 0;
}
// 若 affected 為 0 但 matched > 0,說明匹配到行但值未變
return ($affected > 0) ? $affected : $matched;
}
mysql_info() 提供「Rows matched」與「Changed」信息mysql_affected_rows())affected,為 0 時回退 matched$mysqli->query($sql);
$matched = $mysqli->affected_rows; // 同上行為
// 獲取 matched 需啟用 MYSQLI_REPORT_INDEX 或使用 INFO 查詢
// 推薦:$result = $mysqli->query("SELECT ROW_COUNT()"); // 不可靠
// 最佳:使用 PDO
$stmt = $pdo->prepare($sql);
$stmt->execute();
$changed = $stmt->rowCount(); // 行數變更數
// PDO 無直接 matched 獲取,可執行:
$matched = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn(); // 需配合 SQL_CALC_FOUND_ROWS
// 或在 SQL 中加入 RETURNING 子句(MariaDB 10.5+/MySQL 8.0.20+)
SELECT 判斷,再決定是否 UPDATEUPDATE ... SET col=VAL WHERE id=X AND col<>VAL 讓數據庫層面過濾無效更新,affected_rows 直接反映真實變更Database::executeUpdate() 返回 ['matched'=>N, 'changed'=>M]mysql_*,全面遷移至 PDO + 異常模式