如何在PHP分页功能中指定显示的页数?
嘿,我来帮你解决这个分页页码显示的问题!你的代码已经有了基础的分页计算框架,但还缺了指定显示页码范围的核心逻辑,而且原查询方式效率偏低(直接拉取所有数据再分页),我来帮你修正并完善。
第一步:修正基础分页查询逻辑
先把你不完整的代码补全,改成更高效的分页查询方式(用LIMIT和OFFSET只拉取当前页的数据,避免不必要的性能消耗):
<?php // 假设$pdo已经完成数据库连接初始化 $no_of_records_per_page = 100; // 每页固定显示100条数据 // 1. 先获取总记录数(替代原代码的全量查询) $stmt = $pdo->prepare('SELECT COUNT(*) FROM locations'); $stmt->execute(); $total_records = $stmt->fetchColumn(); $total_pages = ceil($total_records / $no_of_records_per_page); // 计算总页数 // 2. 处理当前页码(默认显示第一页,同时做边界校验) $current_page = isset($_GET['pageno']) ? (int)$_GET['pageno'] : 1; $current_page = max(1, min($current_page, $total_pages)); // 确保页码在有效范围内 // 3. 计算偏移量,查询当前页的目标数据 $offset = ($current_page - 1) * $no_of_records_per_page; $stmt = $pdo->prepare('SELECT * FROM locations LIMIT :offset, :per_page'); $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); $stmt->bindValue(':per_page', $no_of_records_per_page, PDO::PARAM_INT); $stmt->execute(); $page_data = $stmt->fetchAll(); ?>
第二步:指定要显示的页码范围
如果总页数很多(比如几十上百页),我们不需要把所有页码都列出来,通常会显示当前页前后N个页码,再加上首页和尾页,既友好又不会让导航栏太拥挤。比如我们设置显示当前页前后2个页码(最多显示5个连续页码):
<?php // 核心配置:设置当前页前后要显示的页码数量 $pages_around_current = 2; // 计算显示的页码起始、结束范围 $start_show_page = max(1, $current_page - $pages_around_current); $end_show_page = min($total_pages, $current_page + $pages_around_current); // 判断是否需要显示首页/尾页的省略号 $need_show_first_page = $start_show_page > 1; $need_show_last_page = $end_show_page < $total_pages; ?> <!-- 输出分页导航栏 --> <div class="pagination"> <!-- 上一页按钮 --> <a href="?pageno=<?php echo $current_page - 1; ?>" <?php if($current_page === 1) echo 'class="disabled"'; ?>> 上一页 </a> <!-- 首页 + 省略号(如果需要) --> <?php if($need_show_first_page): ?> <a href="?pageno=1">1</a> <?php if($start_show_page > 2): ?> <span>...</span> <?php endif; ?> <?php endif; ?> <!-- 显示中间的目标页码 --> <?php for($i = $start_show_page; $i <= $end_show_page; $i++): ?> <a href="?pageno=<?php echo $i; ?>" <?php if($i === $current_page) echo 'class="active"'; ?>> <?php echo $i; ?> </a> <?php endfor; ?> <!-- 尾页 + 省略号(如果需要) --> <?php if($need_show_last_page): ?> <?php if($end_show_page < $total_pages - 1): ?> <span>...</span> <?php endif; ?> <a href="?pageno=<?php echo $total_pages; ?>"><?php echo $total_pages; ?></a> <?php endif; ?> <!-- 下一页按钮 --> <a href="?pageno=<?php echo $current_page + 1; ?>" <?php if($current_page === $total_pages) echo 'class="disabled"'; ?>> 下一页 </a> </div>
关键说明
- 灵活控制显示页数:调整
$pages_around_current的值就能改变显示的页码数量,比如设为1就显示当前页前后1个(共3个页码),设为3就显示前后3个(共7个页码)。 - 边界安全校验:用
max()和min()确保计算出的页码范围不会超出1到总页数的有效区间,避免出现无效跳转。 - 省略号优化:当总页数远大于显示范围时,用省略号隐藏中间的冗余页码,让导航栏更简洁美观。
这样你就能轻松指定分页显示的页数啦!
内容的提问来源于stack exchange,提问作者user9544660
相关产品推荐
相关产品推荐

