你想知道为什么代码中第二个row没有数据,核心原因是MySQLi 结果集的指针已经遍历到末尾,无法再次读取数据
,具体分析和解决方案如下:
-
结果集指针的工作机制:$stmt->get_result( 获取的 $result 是一个单向移动的结果集,它内部有一个 “指针”,用于指向当前要读取的数据行。当你执行 while $row = mysqli_fetch_assoc($result)) 时,循环会不断调用 mysqli_fetch_assoc( 方法:
-
你的代码执行流程导致指针耗尽:
- 第一步:第一个
while ($row = mysqli_fetch_assoc($result 循环已经完整遍历了所有结果行,指针移动到末尾,循环结束;
- 第二步:当你后续尝试再次使用
while ($row = mysqli_fetch_assoc($result(else 分支中),或者直接打印 $row 时,由于指针已经在末尾,mysqli_fetch_assoc($result 只能返回 false,因此 $row 没有有效数据(要么是 false,要么是最后一行数据的残留,但无法读取新数据)。
-
补充:关于$row变量的残留问题你后续打印的 $row 并非 “新读取的数据”,而是第一个循环结束后的值:
- 循环终止时,
$row = .....mysqli_fetch_assoc($result 赋值为 false(因为指针到末尾);
- 若你用
isset$row) 判断,false 在 PHP 中是 “已设置” 状态,因此会打印 false(看起来没有有效数据);
- 即使有残留,也只是最后一行数据的副本,并非重新读取的结果,且无法获取其他行数据。
PHP 5.3+ 支持 mysqli_fetch_all($result, MYSQLI_ASSOC) 方法,可直接将结果集的所有行一次性读取为关联数组,无需手动循环,更简洁。