根據資料量與 UX 需求,分頁可分為簡易「上一頁/下一頁」與進階「數字循環分頁」兩種模式。本文對比兩者實現邏輯與適用場景。
適用於資料量中等、無需跳轉特定頁的場景。
$limit:每頁筆數(固定)$start:當前偏移量(動態變化)$limit = 20;
$start = isset($_GET['start']) ? max(0, intval($_GET['start'])) : 0;
// 總筆數
$total = mysql_result(mysql_query("SELECT COUNT(*) FROM `table`"), 0);
// 當前頁數據
$data = mysql_query("SELECT * FROM `table` ORDER BY id DESC LIMIT {$start}, {$limit}");
// 導航邏輯
$prev = $start - $limit;
$next = $start + $limit;
if ($prev >= 0) echo '上一頁 ';
if ($next < $total) echo '下一頁';
適用於資料量大、需快速跳轉的場景(如論壇、文章列表)。
$pageSize:每頁筆數(如 25)$pageGroup:每組顯示頁碼數(如 20)頁碼分組公式:$group = floor(($page-1) / $pageGroup)
$start = $group * $pageGroup * $pageSize 計算$page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
$pageSize = 25;
$pageGroup = 20;
$total = mysql_result(mysql_query("SELECT COUNT(*) FROM `table`"), 0);
$totalPages = ceil($total / $pageSize);
// 當前組別
$group = floor(($page - 1) / $pageGroup);
$groupStartPage = $group * $pageGroup + 1;
$groupEndPage = min($groupStartPage + $pageGroup - 1, $totalPages);
// 輸出頁碼
for ($p = $groupStartPage; $p <= $groupEndPage; $p++) {
if ($p == $page) echo "{$p} ";
else echo ''.$p.' ';
}
// 組間導航
if ($group > 0) {
$prevGroupLastPage = $groupStartPage - 1;
echo '« 前'.$pageGroup.'頁 ';
}
if ($groupEndPage < $totalPages) {
$nextGroupFirstPage = $groupEndPage + 1;
echo '後'.$pageGroup.'頁 »';
}
| 維度 | 簡易雙向 | 數字循環 |
|---|---|---|
| 實現複雜度 | 低 | 中 |
| 跳轉效率 | O(N) 逐頁 | O(1) 組間跳轉 |
| 適用資料量 | < 50 頁 | > 50 頁 |
| 用戶體驗 | 基礎 | 優 |
現代化建議:新專案採用前端分頁組件(如 Vue/React Pagination)+ 後端 API 回傳 {data, total, page, pageSize},分離顯示邏輯與資料邏輯。