分頁是資料量較大時的必要功能。本文提供一個完整、可直接運作的 PHP 分頁範例,涵蓋:總筆數查詢、總頁數計算、當前頁驗證、資料庫 LIMIT 查詢、頁碼連結生成。
<?php
// 1. 參數初始化
$page = isset($_GET['page']) ? intval($_GET['page']) : 1; // 當前頁,預設第 1 頁
$perPage = 5; // 每頁筆數
// 2. 資料庫連線 (建議改用 PDO/MySQLi)
$conn = mysql_connect('127.0.0.1', 'root', '');
if (!$conn) die('連線失敗: ' . mysql_error());
mysql_select_db('shop');
// 3. 取得總筆數
$total = mysql_num_rows(mysql_query("SELECT * FROM user"));
// 4. 計算總頁數
$totalPages = ceil($total / $perPage);
// 5. 頁碼邊界檢查
if ($page > $totalPages || $page < 1) {
exit('Error: Page not found.');
}
// 6. 計算 OFFSET 並查詢當頁資料
$offset = ($page - 1) * $perPage;
$result = mysql_query("SELECT * FROM user LIMIT $offset, $perPage");
// 7. 顯示資料
while ($row = mysql_fetch_array($result)) {
echo "id: {$row['id']} name: {$row['name']}<br>";
}
// 8. 生成分頁連結
for ($i = 1; $i <= $totalPages; $i++) {
if ($i == $page) {
echo "$i "; // 當前頁不加連結,加粗顯示
} else {
echo "$i ";
}
}
echo "
共 $total 筆資料,每頁 $perPage 筆,共 $totalPages 頁";
// 9. 釋放資源
mysql_free_result($result);
mysql_close($conn);
?>
| 步驟 | 關鍵公式/邏輯 | 說明 |
|---|---|---|
| 總頁數 | ceil($total / $perPage) |
無條件進位,確保餘數也算一頁 |
| OFFSET | ($page - 1) * $perPage |
第 1 頁 offset=0,第 2 頁 offset=5... |
| LIMIT 語法 | LIMIT $offset, $perPage |
MySQL 專用,跳過 offset 筆,取 perPage 筆 |
| 頁碼驗證 | $page > $totalPages || $page < 1 |
防止非法頁碼導致空白頁或錯誤 |
SELECT COUNT(*) FROM user 而非 mysql_num_rows()/page/7 更美觀WHERE id > $lastId LIMIT 5 避免 OFFSET 深分頁效能問題<?php
$pdo = new PDO('mysql:host=127.0.0.1;dbname=shop', 'root', '');
$perPage = 5;
$page = max(1, (int)($_GET['page'] ?? 1));
// 總筆數
$stmt = $pdo->query("SELECT COUNT(*) FROM user");
$total = $stmt->fetchColumn();
$totalPages = (int)ceil($total / $perPage);
$page = min($page, $totalPages);
// 查詢資料
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("SELECT * FROM user LIMIT :offset, :perPage");
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':perPage', $perPage, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 顯示...
foreach ($rows as $row) {
echo "id: {$row['id']} name: {$row['name']}<br>";
}
// 分頁連結生成同前...
?>