分頁是 Web 開發高頻功能。本文提供一個可復用的 PHP 分頁函數庫,支援數字分頁(1 2 3 4 5)與文字分頁(首頁 上一頁 下一頁 尾頁)兩種模式,並將分頁參數計算與 HTML 輸出分離,便於維護與擴展。
pageParam($sql, $size):計算分頁參數(總記錄數、總頁數、當前頁、偏移量),存入全域變數paging($pageType):根據類型輸出分頁 HTML(1=數字,2=文字)pageParam()/**
* 分頁參數初始化
* @param string $sql 統計總數的 SQL
* @param int $size 每頁筆數
*/
function pageParam($sql, $size) {
global $pagestart, $pagesize, $total, $page, $pageTotal;
$pagesize = $size;
$total = mysql_num_rows(queryDB($sql)); // 需自行實現 queryDB()
// 處理當前頁參數
if (isset($_GET['page'])) {
$page = $_GET['page'];
if (empty($page) || $page < 0 || !is_numeric($page)) $page = 1;
else $page = intval($page);
} else {
$page = 1;
}
// 計算總頁數
$pageTotal = ($total == 0) ? 1 : ceil($total / $pagesize);
// 修正頁碼越界
if ($page > $pageTotal) $page = $pageTotal;
// 當前頁起始偏移量
$pagestart = ($page - 1) * $pagesize;
}
paging()/**
* 輸出分頁 HTML
* @param int $pageType 1=數字分頁, 2=文字分頁
*/
function paging($pageType) {
global $pageTotal, $page, $total;
if ($pageType == 1) { // 數字分頁
echo '';
for ($i = 0; $i < $pageTotal; $i++) {
$p = $i + 1;
$class = ($page == $p) ? ' class="selected"' : '';
echo "- {$p}
";
}
echo '
';
} elseif ($pageType == 2) { // 文字分頁
echo '';
echo "- {$page}/{$pageTotal}頁 |
";
echo "- 共{$total}個會員 |
";
// 首頁/上一頁
if ($page == 1) {
echo '- 首頁 |
- 上一頁 |
';
} else {
$script = $_SERVER["SCRIPT_NAME"]; // 當前腳本名,利於移植
echo "- 首頁 |
";
echo "- 上一頁 |
";
}
// 下一頁/尾頁
if ($page == $pageTotal) {
echo '- 下一頁 |
- 尾頁 |
';
} else {
$script = $_SERVER["SCRIPT_NAME"];
echo "- 下一頁 |
";
echo "- 尾頁 |
";
}
echo '
';
}
}
// 1. 初始化分頁參數(SQL 為統計總數查詢,每頁 2 筆)
pageParam("SELECT userid FROM user", 2);
// 2. 在需要顯示分頁處調用
// 文字分頁
// 數字分頁
page 外的其他 GET 參數1 ... 5 6 7 ... 20,參考第 144035 篇文章的偏移量邏輯mysql_* 替換為 PDO 或 mysqli,防止 SQL 注入