首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 分頁功能完整實作教學

     編輯:PHP 綜合知識

PHP MySQL 分頁核心邏輯與程式碼實作

分頁是資料量較大時的必要功能。本文提供一個完整、可直接運作的 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()
  • 分頁連結省略:頁數過多時顯示「1 ... 5 6 7 8 9 ... 100」
  • URL 重寫:配合 .htaccess 讓網址變 /page/7 更美觀
  • 快取總筆數:資料不常變動時,用 Redis/Memcached 快取 $total
  • 游標分頁:超大資料集改用 WHERE id > $lastId LIMIT 5 避免 OFFSET 深分頁效能問題

現代化重寫 (PDO 版)

<?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>";
}
// 分頁連結生成同前...
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved