返回值:
>= 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 |
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)
?>
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; // 返回總影響行數
?>
rowCount(),行為一致