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

PHP 簡易分頁:上一頁/下一頁按鈕與頁碼列表

     編輯:PHP 綜合知識

程式碼來源

本範例改編自 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(需注意整數除法)。

常見問題與修正

現代化重構範例 (PDO)

<?php
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$limit = 20;
$page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
$offset = ($page - 1) * $limit;

$where = "WHERE status=1"; // 動態建構
$params = [];

$stmt = $pdo->prepare("SELECT COUNT(*) FROM articles $where");
$stmt->execute($params);
$total = $stmt->fetchColumn();
$pages = ceil($total / $limit);

$stmt = $pdo->prepare("SELECT id,title FROM articles $where ORDER BY id DESC LIMIT :offset, :limit");
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->execute($params);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($rows as $row) { echo $row['title']."<br>"; }

// 分頁導航
echo '<nav aria-label="Pagination"><ul class="pagination">';
if ($page > 1) echo '<li><a href="?page='.($page-1).'">« 上一頁</a></li>';
for ($i=1; $i<=$pages; $i++) {
    $class = ($i==$page) ? ' class="active"' : '';
    echo "<li$class><a href=\"?page=$i\">$i</a></li>";
}
if ($page < $pages) echo '<li><a href="?page='.($page+1).'">下一頁 »</a></li>';
echo '</ul></nav>';
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題修正建議
$offset 初值為 1應為 0,否則第一頁會跳過第一筆資料。
直接使用 $PHP_SELF易受 XSS 攻擊,建議用 htmlspecialchars($_SERVER['PHP_SELF']) 或固定檔名。
mysql_* 函式已棄用改用 mysqli 或 PDO 預處理語句。
SQL 直接拼接變數參數化查詢:$stmt->bind_param("i", $offset)。
無保留查詢條件分頁連結需帶上搜尋關鍵字、排序欄位等 GET 參數。