早期 PHP 分頁常見於單一檔案混合 HTML、SQL、邏輯。本文整理經典分頁程式碼,說明核心邏輯並提供現代化重構建議。
<?php
$limit = 25;
$start = isset($_GET['start']) ? intval($_GET['start']) : 0;
$s = isset($_GET['s']) ? intval($_GET['s']) : 0; // 區塊頁碼索引
mysql_connect("localhost", "", "");
mysql_select_db("database");
// 1. 取得總筆數
$result = mysql_query("SELECT * FROM table");
$num = mysql_num_rows($result);
// 2. 分頁查詢
$result = mysql_query("SELECT * FROM table ORDER BY id LIMIT $start, $limit");
$numb = mysql_num_rows($result);
// 3. 顯示資料
echo "<table>";
for ($i = 0; $i < $numb; $i++) {
$val = mysql_result($result, $i, "val");
$val1 = mysql_result($result, $i, "val1");
echo "<tr><td>$val</td><td>$val1</td></tr>";
}
echo "</table>";
// 4. 分頁導航生成(簡化版邏輯)
echo "<table><tr><td>頁:</td>";
// 上一區塊連結
if ($s > 20) { ... }
// 頁碼迴圈(每區塊顯示 20 頁)
for ($page = $s; $page < ($num / $limit); $page++) { ... }
// 下一區塊連結
if ($page > 0 && ($page % 20) == 0) { ... }
echo "</tr></table>";
?>
| 變數 | 含義 |
|---|---|
$limit | 每頁筆數 |
$start | 資料查詢起始位移(page * limit) |
$s | 分頁導航區塊索引(每區塊 20 頁) |
$star | 當前頁對應的 $start 值,用於判斷是否加連結 |
mysql_* 函數改用 PDO 或 MySQLi,採用預處理語句防止 SQL 注入:
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$stmt = $pdo->prepare("SELECT * FROM table ORDER BY id LIMIT :start, :limit");
$stmt->bindValue(':start', $start, PDO::PARAM_INT);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->execute();
參考 Pager 類別,將計算邏輯與顯示分離。
function renderPagination($currentPage, $totalPages, $baseUrl, $range = 5) {
$html = "<nav aria-label='Pagination'><ul class='pagination'>";
// 首頁、上一頁
if ($currentPage > 1) {
$html .= "<li><a href='{$baseUrl}page=1'>首頁</a></li>";
$html .= "<li><a href='{$baseUrl}page=" . ($currentPage - 1) . "'>上一頁</a></li>";
}
// 頁碼範圍
$start = max(1, $currentPage - $range);
$end = min($totalPages, $currentPage + $range);
for ($i = $start; $i <= $end; $i++) {
$class = ($i == $currentPage) ? " class='active'" : "";
$html .= "<li$class><a href='{$baseUrl}page=$i'>$i</a></li>";
}
// 下一頁、末頁
if ($currentPage < $totalPages) {
$html .= "<li><a href='{$baseUrl}page=" . ($currentPage + 1) . "'>下一頁</a></li>";
$html .= "<li><a href='{$baseUrl}page=$totalPages'>末頁</a></li>";
}
$html .= "</ul></nav>";
return $html;
}
搭配 Bootstrap、Tailwind CSS 或 Vue/React 元件,實現無刷新分頁(AJAX/Fetch)或 SSR 渲染。
SELECT *,僅查詢必要欄位。id、排序欄位)。SQL_CALC_FOUND_ROWS + FOUND_ROWS() 或單獨 COUNT(*) 查詢總數。分頁看似簡單,但涉及資料庫效能、使用者體驗、安全性等多面向,建議採用成熟套件(如 illuminate/pagination、knplabs/knp-paginator-bundle)而非手工維護。