根本原因是continue跳过了条件变量更新语句,导致while循环条件恒真;for循环的步进表达式不受continue影响,而while完全依赖手动更新。

continue 在 while 中没推进条件变量,就会卡住
根本原因不是 continue 本身有问题,而是它跳过了本该更新循环条件的代码。while 循环靠「条件表达式每次重新求值」来决定是否继续,如果 continue 后面紧跟着的是更新语句(比如 $i++ 或 $row = mysqli_fetch_assoc($result)),那这一轮就永远不执行更新,条件永远为真。
常见错误模式:
- 把
$row = mysqli_fetch_assoc($result)写在while条件里,但又在循环体开头加了continue,导致下一轮条件里的赋值被跳过 - 循环体中用
if判断后直接continue,却忘了把$count++或next($array)放在continue前面或外面 - 嵌套 while 时,内层
continue只影响内层,外层条件变量没被修改,外层也停不下来
mysqli_fetch_assoc + continue 组合最容易翻车
这是生产环境高频踩坑点:你本意是跳过某些行,但误把数据获取逻辑和控制流混在一起。
危险写法:
立即学习“PHP免费学习笔记(深入)”;
$result = mysqli_query($mysqli, "SELECT id, name FROM users");
while ($row = mysqli_fetch_assoc($result)) {
if ($row['id'] == 100) continue;
// 后续处理...
}
这段代码本身没问题——$row = mysqli_fetch_assoc($result) 在每次 while 条件判断时执行,continue 只跳过本轮循环体,不影响下一轮的赋值。
但只要稍作改动,立刻死循环:
$result = mysqli_query($mysqli, "SELECT id, name FROM users");
$row = mysqli_fetch_assoc($result); // ❌ 提前取一次
while ($row) { // ❌ 条件不再调用 fetch,$row 永远不变
if ($row['id'] == 100) continue; // ❌ 跳过后续,但 $row 不更新
// ...
}
这里 while($row) 的条件恒真(只要第一行存在),continue 后没任何代码能改 $row,循环体无限重入。
for 循环里 continue 后的步进仍会执行,while 不会
这是关键差异:for 的第三个表达式(如 $i++)在每次循环体结束后、下轮条件判断前**强制执行**;而 while 完全依赖你手动更新条件变量,continue 会直接跳回条件判断,中间所有代码都不走。
所以这些写法行为完全不同:
for($i=0; $i → 输出 <code>0134($i++照常)$i=0; while($i → 输出 <code>01后卡死($i++被跳过,$i永远是 2)
想在 while 里安全用 continue,更新语句必须放在 continue 之前,或者包进一个不会被跳过的逻辑块里,比如:
while ($row = mysqli_fetch_assoc($result)) {
if ($row['id'] == 100) {
continue; // 安全:fetch 已在条件里完成
}
process($row);
}
调试时怎么一眼看出问题
死循环往往不是 continue 单独导致的,而是它暴露了条件变量更新缺失这个深层问题。排查优先看三点:
- while 条件里是否包含函数调用(如
mysqli_fetch_assoc())?如果是,continue不影响它;如果不是(比如纯变量$flag),就要确认这个变量在哪更新 - 循环体里有没有把「更新条件」和「业务逻辑」写反顺序?常见把
$i++放在echo后面,结果continue直接跳过它 - 用
error_log("loop step: $i");打点,看日志是否卡在同一个值上——如果是,说明条件变量没变
最隐蔽的坑是变量复用:比如 $result 既存查询结果又存 curl 返回值,continue 后下一轮 mysqli_fetch_assoc($result) 就收不到资源,但错误可能被静默吞掉,只表现为循环突然终止或数据重复。这种得靠 IDE 的变量追踪或 xdebug 单步才能定位。



















