• 网站

    mysql查询数据,第二个row没有数据

    你想知道为什么代码中第二个row没有数据,核心原因是MySQLi 结果集的指针已经遍历到末尾,无法再次读取数据

    ,具体分析和解决方案如下:

    一、核心原因:结果集指针已耗尽(一次性遍历特性)

    1. 结果集指针的工作机制$stmt->get_result( 获取的 $result 是一个单向移动的结果集,它内部有一个 “指针”,用于指向当前要读取的数据行。当你执行 while $row = mysqli_fetch_assoc($result)) 时,循环会不断调用 mysqli_fetch_assoc( 方法:
      • 每次调用会读取当前指针指向的行数据,并将指针向后移动一位
      • 当指针移动到结果集末尾(没有更多数据行)时,mysqli_fetch_assoc() 会返回 false,循环终止。

        此时,结果集指针已经停留在末尾,无法再向前移动,这就是 MySQLi 结果集的一次性遍历特性(默认不可重复读取)。

    2. 你的代码执行流程导致指针耗尽
      • 第一步:第一个 while ($row = mysqli_fetch_assoc($result 循环已经完整遍历了所有结果行,指针移动到末尾,循环结束;
      • 第二步:当你后续尝试再次使用 while ($row = mysqli_fetch_assoc($result(else 分支中),或者直接打印 $row 时,由于指针已经在末尾,mysqli_fetch_assoc($result 只能返回 false,因此 $row 没有有效数据(要么是 false,要么是最后一行数据的残留,但无法读取新数据)。
    3. 补充:关于$row变量的残留问题你后续打印的 $row 并非 “新读取的数据”,而是第一个循环结束后的值:
      • 循环终止时,$row = .....mysqli_fetch_assoc($result 赋值为 false(因为指针到末尾);
      • 若你用 isset$row) 判断,false 在 PHP 中是 “已设置” 状态,因此会打印 false(看起来没有有效数据);
      • 即使有残留,也只是最后一行数据的副本,并非重新读取的结果,且无法获取其他行数据。

    方法 3:使用 mysqli_fetch_all() 一次性获取所有行(简化版方法 1)

    PHP 5.3+ 支持 mysqli_fetch_all($result, MYSQLI_ASSOC) 方法,可直接将结果集的所有行一次性读取为关联数组,无需手动循环,更简洁。