使用mysqli过程式实现分页查询时无数据显示的问题排查
排查mysqli过程式分页无数据显示的问题
嗨,我之前也踩过类似的坑,用mysqli过程式做分页时明明数据库有数据却显示空,大概率是这几个地方出了问题,我给你拆解一下:
最容易忽略的关键步骤:忘记存储结果集
这是预处理语句特有的坑!你执行完mysqli_stmt_execute()之后,必须调用mysqli_stmt_store_result($stmt),不然mysqli_stmt_num_rows()根本拿不到正确的行数,直接返回0,自然就会提示无记录了。因为预处理语句的结果默认存在数据库端,不调用这个函数把结果拉到本地,PHP就没法统计行数。
分页参数计算出错
比如处理页码时没做整数转换,或者默认页码设成了0,导致偏移量计算错误:
- 如果用户没传
page参数,$_GET['page']是空值,直接用的话会导致$offset = (0-1)*10 = -10,LIMIT -10,10是无效语法,查不到任何数据。 - 正确的处理方式是强制转成整数,并且确保页码不小于1:
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1; $page = max($page, 1); // 防止页码小于1 $offset = ($page - 1) * 10;
预处理语句的参数绑定或执行出错
你可能没检查语句准备、绑定、执行的过程是否有错误:
- 准备语句时
mysqli_prepare($conn, $sql)失败了(比如SQL语法错误、表名写错),但你没判断返回值就继续执行; - 绑定参数时类型写错了:
LIMIT后面的两个参数都是整数,必须用'ii'作为类型符,如果用了s(字符串类型),会导致查询逻辑出错; - 执行语句失败后没获取错误信息,建议用
mysqli_stmt_error($stmt)查看具体错误原因。
结果绑定的字段不匹配
如果mysqli_stmt_bind_result()里的变量顺序、数量和SELECT语句中的字段不对应,即使有数据也没法正确取出来。
修正后的完整示例代码
我把所有关键步骤都加上了错误检查,你可以对照着调整自己的代码:
<?php // 开启错误提示,方便排查问题 error_reporting(E_ALL); ini_set('display_errors', 1); // 1. 数据库连接(替换成你的实际信息) $conn = mysqli_connect('localhost', '你的用户名', '你的密码', '你的数据库名'); if (!$conn) { die("数据库连接失败: " . mysqli_connect_error()); } // 2. 处理分页参数 $per_page = 10; $page = isset($_GET['page']) ? (int)$_GET['page'] : 1; $page = max($page, 1); // 确保页码不小于1 $offset = ($page - 1) * $per_page; // 3. 查询总记录数,计算总页数 $count_stmt = mysqli_prepare($conn, "SELECT COUNT(*) FROM 你的数据表名"); if (!$count_stmt) { die("准备计数语句失败: " . mysqli_error($conn)); } mysqli_stmt_execute($count_stmt); mysqli_stmt_bind_result($count_stmt, $total_records); mysqli_stmt_fetch($count_stmt); mysqli_stmt_close($count_stmt); $total_pages = ceil($total_records / $per_page); // 4. 查询分页数据 $data_stmt = mysqli_prepare($conn, "SELECT id, 字段1, 字段2 FROM 你的数据表名 LIMIT ?, ?"); if (!$data_stmt) { die("准备数据查询语句失败: " . mysqli_error($conn)); } // 绑定两个整数参数,类型符为'ii' mysqli_stmt_bind_param($data_stmt, 'ii', $offset, $per_page); // 执行语句并检查结果 if (!mysqli_stmt_execute($data_stmt)) { die("执行查询失败: " . mysqli_stmt_error($data_stmt)); } // 关键步骤:存储结果集,否则无法获取正确的行数 mysqli_stmt_store_result($data_stmt); $num_rows = mysqli_stmt_num_rows($data_stmt); if ($num_rows === 0) { echo "Result set has 0 rows. No record found! Try another time."; } else { // 绑定结果字段(要和SELECT语句中的字段顺序完全一致) mysqli_stmt_bind_result($data_stmt, $id, $field1, $field2); // 输出HTML表格 echo "<table border='1' cellpadding='5' cellspacing='0'> <tr> <th>ID</th> <th>字段1</th> <th>字段2</th> </tr>"; // 循环获取每一条数据 while (mysqli_stmt_fetch($data_stmt)) { echo "<tr> <td>$id</td> <td>$field1</td> <td>$field2</td> </tr>"; } echo "</table>"; // 分页导航 echo "<div style='margin-top:15px;'>"; if ($page > 1) { echo "<a href='?page=" . ($page - 1) . "'>上一页</a> "; } for ($i = 1; $i <= $total_pages; $i++) { echo "<a href='?page=$i'" . ($i == $page ? " style='font-weight:bold; color:#f00;'" : "") . ">$i</a> "; } if ($page < $total_pages) { echo "<a href='?page=" . ($page + 1) . "'>下一页</a>"; } echo "</div>"; } // 清理资源 mysqli_stmt_close($data_stmt); mysqli_close($conn); ?>
最后再核对这几点
- 确认你的表名、字段名和数据库中的完全一致(Linux环境下MySQL是大小写敏感的);
- 直接在数据库客户端执行你的SQL语句(比如
SELECT * FROM 你的表名 LIMIT 0,10),确认能查到数据; - 开启PHP错误提示,能快速定位隐藏的语法或逻辑问题。
内容的提问来源于stack exchange,提问作者Php Learner
相关产品推荐
相关产品推荐

