Web 開發已成為分布式程式開發的主流,資料庫操作更是不可或缺的環節。當資料量龐大時,分頁顯示不僅能提升閱讀體驗,更能有效降低伺服器負載。本文將深入淺出地講解 PHP 配合 MySQL 實現分頁的核心原理、關鍵代碼解析,並提供完整可執行的範例供參考。
分頁邏輯主要依賴兩個關鍵參數:
MySQL 提供 LIMIT offset, rows 語法支援分頁查詢:
offset = $pagesize * ($page - 1),表示資料偏移量。rows = $pagesize,表示需取回的筆數。例如 SELECT * FROM table LIMIT 10, 10 會從第 11 筆資料開始,取回 10 筆記錄(即第 11~20 筆)。
<?php
// 1. 設定每頁筆數
$pagesize = 10;
// 2. 連接資料庫(建議改用 mysqli 或 PDO)
$conn = mysql_connect("localhost", "root", "");
mysql_select_db("mydata", $conn);
// 3. 取得總記錄數
$rs = mysql_query("SELECT COUNT(*) FROM tb_product", $conn);
$myrow = mysql_fetch_array($rs);
$numrows = $myrow[0];
// 4. 計算總頁數(無條件進位)
$pages = ceil($numrows / $pagesize);
// 5. 取得當前頁碼,預設為第 1 頁
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
// 6. 計算偏移量
$offset = $pagesize * ($page - 1);
// 7. 執行分頁查詢
$sql = "SELECT * FROM tb_product LIMIT $offset, $pagesize";
$result = mysql_query($sql, $conn);
// 8. 輸出資料與分頁導航(略)
?>
注意:mysql_* 函式已棄用,實務上請改用 mysqli 或 PDO 並採用預處理語句防止 SQL 注入。
CREATE TABLE myTable (
id INT NOT NULL AUTO_INCREMENT,
news_title VARCHAR(50),
news_cont TEXT,
add_time DATETIME,
PRIMARY KEY (id)
);
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHP MySQL 分頁示例</title>
</head>
<body>
<?php
$conn = mysqli_connect("localhost", "root", "", "mydata");
if (!$conn) { die("連線失敗: " . mysqli_connect_error()); }
$pagesize = 5; // 每頁 5 筆
$page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
$offset = ($page - 1) * $pagesize;
// 總筆數
$total = mysqli_fetch_row(mysqli_query($conn, "SELECT COUNT(*) FROM tb_product"))[0];
$totalPages = ceil($total / $pagesize);
// 分頁查詢
$sql = "SELECT * FROM tb_product LIMIT $offset, $pagesize";
$res = mysqli_query($conn, $sql);
?>
<table border="1" cellpadding="5">
<tr><th>ID</th><th>產品名稱</th><th>價格</th></tr>
<?php while ($row = mysqli_fetch_assoc($res)): ?>
<tr>
<td><?= $row['id'] ?></td>
<td><?= htmlspecialchars($row['name']) ?></td>
<td><?= $row['price'] ?></td>
</tr>
<?php endwhile; ?>
</table>
<div class="pagination">
<?php if ($page > 1): ?>
<a href="?page=1">首頁</a>
<a href="?page=<?= $page-1 ?>">上一頁</a>
<?php endif; ?>
<span>第 <?= $page ?> / <?= $totalPages ?> 頁</span>
<?php if ($page < $totalPages): ?>
<a href="?page=<?= $page+1 ?>">下一頁</a>
<a href="?page=<?= $totalPages ?>">末頁</a>
<?php endif; ?>
</div>
<?php mysqli_close($conn); ?>
</body>
</html>
COUNT(*) 查詢。WHERE id > last_id LIMIT n 避免 OFFSET 深分頁效能問題。