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

使用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);
?>

最后再核对这几点

  1. 确认你的表名、字段名和数据库中的完全一致(Linux环境下MySQL是大小写敏感的);
  2. 直接在数据库客户端执行你的SQL语句(比如SELECT * FROM 你的表名 LIMIT 0,10),确认能查到数据;
  3. 开启PHP错误提示,能快速定位隐藏的语法或逻辑问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:54:16