列表頁幾乎都需要分頁,將分頁邏輯封裝為獨立函數 pageft() 存放於 pageft.php,使用時 include 並調用即可。設計目標:可移植、易用、不輸出直接生成變量供調用者控制。
pageft.php 完整代碼<?php
if (!function_exists('pageft')) {
function pageft($totle, $displaypg = 20, $url = '') {
global $page, $firstcount, $pagenav, $_SERVER;
$GLOBALS['displaypg'] = $displaypg; // 導出每頁條數供外部 LIMIT 使用
// 當前頁碼,默認第 1 頁
if (!$page) $page = 1;
// 基礎 URL 處理:去除舊 page 參數,追加佔位符
if (!$url) $url = $_SERVER['REQUEST_URI'];
$parse = parse_url($url);
$query = $parse['query'] ?? '';
if ($query) {
$query = preg_replace('/(^|&)page=\d+/', '', $query);
$url = str_replace($parse['query'], $query, $url);
$url .= ($query ? '&page' : 'page');
} else {
$url .= '?page';
}
// 頁碼計算
$lastpg = ceil($totle / $displaypg); // 總頁數
$page = min($lastpg, max(1, $page)); // 邊界修正
$prepg = $page - 1; // 上一頁
$nextpg = ($page == $lastpg) ? 0 : $page + 1; // 下一頁,0 表示無
$firstcount = ($page - 1) * $displaypg; // LIMIT 起始偏移
// 生成導航 HTML
$pagenav = "顯示第 " . ($totle ? $firstcount + 1 : 0) . "-" . min($firstcount + $displaypg, $totle) . " 條,共 $totle 條記錄";
if ($lastpg <= 1) return false; // 單頁直接返回
$pagenav .= " <a href='{$url}=1'>首頁</a> ";
$pagenav .= $prepg ? " <a href='{$url}={$prepg}'>前頁</a> " : " 前頁 ";
$pagenav .= $nextpg ? " <a href='{$url}={$nextpg}'>後頁</a> " : " 後頁 ";
$pagenav .= " <a href='{$url}={$lastpg}'>尾頁</a> ";
// 下拉跳轉選單
$pagenav .= " 到第 <select onchange='location=this.value'>";
for ($i = 1; $i <= $lastpg; $i++) {
$sel = ($i == $page) ? " selected" : "";
$pagenav .= "<option value='{$url}={$i}'{$sel}>{$i}</option>";
}
$pagenav .= "</select> 頁,共 {$lastpg} 頁";
}
}
?>
<?php
include('pageft.php');
// 1. 獲取總記錄數
$total = mysql_result(mysql_query("SELECT COUNT(*) FROM mytable"), 0);
// 2. 調用分頁函數(每頁 10 條,使用當前 URL)
pageft($total, 10);
// 3. 查詢當前頁數據
$result = mysql_query("SELECT * FROM mytable LIMIT $firstcount, $displaypg");
while ($row = mysql_fetch_assoc($result)) {
// 輸出列表行...
echo $row['title'] . "<br>";
}
// 4. 輸出分頁導航
echo $pagenav;
?>
| 變量 | 用途 |
|---|---|
$firstcount | SQL LIMIT 起始偏移量 |
$displaypg | 每頁顯示條數(同傳入參數) |
$pagenav | 完整分頁導航 HTML 字符串,直接 echo 輸出 |
$page | 當前頁碼(可用於頁碼顯示) |
mysql_* 替換為 mysqli 或 PDO。LIMIT offset, rows 優化或游標分頁。