自定义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
相关产品推荐
相关产品推荐

