如何统计MySQLi预编译SQL返回行数并存储到PHP变量中
PHP mysqli 预处理语句获取查询返回行数的实现方法
你可以通过以下两种常用方式实现需求,可根据你的实际业务场景选择:
方式1:不修改原有查询,同时支持遍历结果和获取行数
这种方式适合你既要循环输出查询结果,又要统计行数的场景,只需要在原有代码基础上补充2行代码即可:
- 执行
execute()之后调用store_result()将结果集从MySQL服务端拉取到PHP客户端,这是num_rows属性能正确返回行数的前提 - 直接读取
$stmt->num_rows属性拿到行数存入变量即可
完整可运行代码示例:
$stmt = $con->prepare('SELECT id, owner_id, hs_name, hs_address FROM hotspots WHERE owner_id = ?'); $stmt->bind_param('i', $_SESSION['id']); $stmt->execute(); // 新增:拉取结果集到客户端 $stmt->store_result(); // 新增:获取行数存入变量 $row_count = $stmt->num_rows; $stmt->bind_result($hsid, $ownerid, $hsname, $hsaddress); while($stmt->fetch()) { // 原有循环输出结果的逻辑 } // 页面中直接输出即可 echo "共查询到{$row_count}条符合条件的记录"; // 用完释放资源 $stmt->free_result(); $stmt->close();
方式2:仅需要统计行数不需要遍历结果,性能更优
如果你不需要获取具体的记录内容,只需要统计行数,直接使用COUNT(*)做查询即可,不需要拉取所有业务数据,性能更高:
$stmt = $con->prepare('SELECT COUNT(*) FROM hotspots WHERE owner_id = ?'); $stmt->bind_param('i', $_SESSION['id']); $stmt->execute(); $stmt->bind_result($row_count); $stmt->fetch(); $stmt->close(); // 直接使用$row_count变量即可 echo "共查询到{$row_count}条符合条件的记录";
注意事项
- 方式1中如果省略
store_result()调用,num_rows会始终返回0,这是很多人踩坑的点 - 处理完结果集后记得调用
free_result()释放内存,避免不必要的资源占用
内容的提问来源于stack exchange,提问作者James Grunshaw
相关产品推荐
相关产品推荐

