如何在PHP中限制分页显示的页码数量?
实现PHP分页的页码数量限制功能
我来帮你改造这段分页代码,实现你想要的页码数量限制+省略号占位的效果,避免页码过多时全部展示。先看改造后的完整代码,之后我会拆解关键逻辑:
<?php // 注意:mysql_* 函数已被PHP废弃,建议替换为mysqli或PDO以保证安全性和兼容性 $default_index = 0; $default_batas = 2; $show_page_count = 5; // 要显示的最大页码数量,对应你示例中的1-5 if(isset($_GET['batas'])) { $default_batas = $_GET['batas']; } // 获取当前页码,默认是1 $current_page = isset($_GET['halaman']) ? (int)$_GET['halaman'] : 1; $default_index = ($current_page - 1) * $default_batas; // 获取数据和总条数 $ambil_data = mysql_query("SELECT * FROM mytable ORDER BY id ASC Limit ".$default_index.", ".$default_batas); $total_baris = mysql_num_rows(mysql_query("SELECT * FROM mytable")); $total_pages = ceil($total_baris / $default_batas); // 计算总页数,比循环减法更准确 $html_paging = "<div>"; // 处理分页逻辑 if ($total_pages <= $show_page_count) { // 总页数不多,直接显示所有页码 for ($i = 1; $i <= $total_pages; $i++) { $active = ($i == $current_page) ? "style='font-weight:bold;'" : ""; $html_paging .= "<div><a href='?halaman=".$i."&batas=".$default_batas."' ".$active.">".$i."</a></div>"; } } else { // 总页数超过限制,需要显示省略号 // 1. 显示第一页 $html_paging .= "<div><a href='?halaman=1&batas=".$default_batas."'>1</a></div>"; // 2. 处理中间部分的省略号和页码 if ($current_page <= $show_page_count - 2) { // 当前页在靠前位置,显示前5个页码 + 最后一页的省略号 for ($i = 2; $i <= $show_page_count; $i++) { $active = ($i == $current_page) ? "style='font-weight:bold;'" : ""; $html_paging .= "<div><a href='?halaman=".$i."&batas=".$default_batas."' ".$active.">".$i."</a></div>"; } $html_paging .= "<div>..</div>"; $html_paging .= "<div><a href='?halaman=".$total_pages."&batas=".$default_batas."'>".$total_pages."</a></div>"; } elseif ($current_page >= $total_pages - ($show_page_count - 2)) { // 当前页在靠后位置,显示第一页的省略号 + 最后5个页码 $html_paging .= "<div>..</div>"; for ($i = $total_pages - ($show_page_count - 1); $i <= $total_pages; $i++) { $active = ($i == $current_page) ? "style='font-weight:bold;'" : ""; $html_paging .= "<div><a href='?halaman=".$i."&batas=".$default_batas."' ".$active.">".$i."</a></div>"; } } else { // 当前页在中间位置,显示前后省略号 + 当前页附近的页码 $html_paging .= "<div>..</div>"; // 显示当前页前后各2个页码(总共5个) for ($i = $current_page - 2; $i <= $current_page + 2; $i++) { $active = ($i == $current_page) ? "style='font-weight:bold;'" : ""; $html_paging .= "<div><a href='?halaman=".$i."&batas=".$default_batas."' ".$active.">".$i."</a></div>"; } $html_paging .= "<div>..</div>"; $html_paging .= "<div><a href='?halaman=".$total_pages."&batas=".$default_batas."'>".$total_pages."</a></div>"; } } $html_paging .= "</div><br/>"; ?> <!-- 输出部分 --> <?php echo $ambil_data; // 这里你原代码写的$output_html,应该是输出数据的部分 ?> <?php echo $html_paging; ?>
关键逻辑拆解
- 总页数计算:用
ceil($total_baris / $default_batas)替代原有的循环减法,能更准确地得到总页数(比如总条数是7,每页2条,总页数是4而不是3)。 - 页码显示规则:
- 当总页数≤5时,直接显示所有页码,不用省略号。
- 当总页数>5时,分三种场景:
- 当前页在前3页:显示
1 2 3 4 5 .. 最后一页(对应你示例中点击3时的1 2 3 .. 5样式)。 - 当前页在后3页:显示
1 .. 总页数-4 总页数-3 总页数-2 总页数-1 总页数。 - 当前页在中间:显示
1 .. 当前页-2 当前页-1 当前页 当前页+1 当前页+2 .. 最后一页(对应你示例中的.. 2 3 4 ..样式)。
- 当前页在前3页:显示
- 当前页高亮:给当前页码加了加粗样式,方便用户识别当前位置。
注意事项
- 原代码使用的
mysql_*函数已经被PHP官方废弃,存在安全风险,建议尽快替换为mysqli_*或PDO扩展。 - 可以根据需求调整
$show_page_count的值,比如改成7就能显示更多的页码。
内容的提问来源于stack exchange,提问作者user3075428
相关产品推荐
相关产品推荐

