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

如何在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; ?>

关键逻辑拆解

  1. 总页数计算:用ceil($total_baris / $default_batas)替代原有的循环减法,能更准确地得到总页数(比如总条数是7,每页2条,总页数是4而不是3)。
  2. 页码显示规则:
    • 当总页数≤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:06:14