You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义PHP数据库类中IF判断后WHILE循环无输出问题

数据库查询后WHILE循环无输出问题排查

问题描述

作为函数开发新手,执行数据库查询时遇到异常:使用自定义Classy类执行查询后,通过fetchN方法判断结果行数的IF语句可正常工作,但IF内的WHILE循环调用fetchF方法却无法输出任何内容;移除IF/ELSE语句后,WHILE循环在有数据时可正常输出。

相关代码

业务代码

$n = 0;
$qr=$Classy->queryF("SELECT * FROM `users` WHERE user_status != 3 ORDER BY user_id");
if ($Classy->fetchN($qr) > 0) {
   while ($data = $Classy->fetchF($qr)) {
      $n = $n + 1;
      echo $data['username']."<br>";
   }
} else {
   echo "No users";
}

Classy类代码

class Classy
{
  function queryF($setQuery) {
    $conn = $this->connection;   // 此连接正常
    $query = $conn->query($setQuery);
    return $query;
  }
  function fetchF($setFetch) {
    $row = $setFetch->fetch();
    return $row;  
  }
  function fetchN($setFetch) {
    $row = $setFetch->fetchColumn();
    return $row;  
  }
}

问题原因

你的fetchN方法调用了fetchColumn(),这个方法会移动结果集的指针,取到结果集第一列的第一行数据,同时指针会跳到下一行。当后续在WHILE循环里调用fetch()时,结果集的指针已经不在起始位置:如果查询结果只有1条数据,指针已经到了结果集末尾,自然无法再获取数据;如果有多条数据,也会丢失第一条数据。

而移除IF语句后,直接调用fetch()是从结果集起始位置开始读取,所以能正常输出。

解决方案

有两种可行的修改方式:

方式一:修改fetchN方法,用rowCount()获取行数

把fetchN方法改成用PDO的rowCount()获取结果行数,这样不会移动结果集指针:

function fetchN($setFetch) {
  $row = $setFetch->rowCount();
  return $row;  
}

注:rowCount()对SELECT语句的支持取决于数据库驱动,MySQL的PDO驱动是支持的。

方式二:先获取所有结果到数组,再判断遍历

先把所有查询结果读取到数组中,之后再判断数组长度并遍历,避免指针移动问题:

$n = 0;
$qr=$Classy->queryF("SELECT * FROM `users` WHERE user_status != 3 ORDER BY user_id");
$users = [];
while ($data = $Classy->fetchF($qr)) {
  $users[] = $data;
}
if (count($users) > 0) {
  foreach ($users as $user) {
    $n = $n + 1;
    echo $user['username']."<br>";
  }
} else {
  echo "No users";
}

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:27:21