本範例改編自 phpbuilder.com,展示最基本的「上一頁/下一頁」按鈕與數字頁碼列表分頁功能,使用 MySQL LIMIT offset, count 切分資料。
<?php
$limit = 20; // 每頁筆數
$numresults = mysql_query("SELECT * FROM TABLE WHERE YOUR CONDITIONAL HERE ORDER BY WHATEVER");
$numrows = mysql_num_rows($numresults);
if (empty($offset)) $offset = 1; // 注意:offset 應為 0 起始
$result = mysql_query("SELECT id,name,phone FROM TABLE WHERE YOUR CONDITIONAL HERE ORDER BY WHATEVER LIMIT $offset,$limit");
while ($data = mysql_fetch_array($result)) {
// 顯示資料列
}
// 上一頁連結
if ($offset != 1) {
$prevoffset = $offset - 20;
echo "<a href=\"$PHP_SELF?offset=$prevoffset\">上一頁</a> ";
}
// 計算總頁數
$pages = intval($numrows / $limit);
if ($numrows % $limit) $pages++;
// 頁碼列表
for ($i=1; $i<=$pages; $i++) {
$newoffset = $limit * ($i-1);
echo "<a href=\"$PHP_SELF?offset=$newoffset\">$i</a> ";
}
// 下一頁連結
if (!(($offset/$limit) == $pages) && $pages != 1) {
$newoffset = $offset + $limit;
echo "<a href=\"$PHP_SELF?offset=$newoffset\">下一頁</a><p>";
}
?>
$offset 為資料起始位移(0-based),但原碼初始值設為 1,實際應為 0。LIMIT $offset, $limit:MySQL 採 LIMIT offset, row_count。$pages = ceil($numrows / $limit)。$newoffset = $limit * ($i-1)。($offset/$limit) == $pages(需注意整數除法)。| 問題 | 修正建議 |
|---|---|
$offset 初值為 1 | 應為 0,否則第一頁會跳過第一筆資料。 |
直接使用 $PHP_SELF | 易受 XSS 攻擊,建議用 htmlspecialchars($_SERVER['PHP_SELF']) 或固定檔名。 |
mysql_* 函式已棄用 | 改用 mysqli 或 PDO 預處理語句。 |
| SQL 直接拼接變數 | 參數化查詢:$stmt->bind_param("i", $offset)。 |
| 無保留查詢條件 | 分頁連結需帶上搜尋關鍵字、排序欄位等 GET 參數。 |