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

PHP MySQL 分頁導航完整實作:從邏輯到介面

     編輯:PHP 相關知識

傳統分頁程式碼重構與優化指南

早期 PHP 分頁常見於單一檔案混合 HTML、SQL、邏輯。本文整理經典分頁程式碼,說明核心邏輯並提供現代化重構建議。

原始程式碼核心邏輯分析

<?php
$limit = 25;
$start = isset($_GET['start']) ? intval($_GET['start']) : 0;
$s = isset($_GET['s']) ? intval($_GET['s']) : 0; // 區塊頁碼索引

mysql_connect("localhost", "", "");
mysql_select_db("database");

// 1. 取得總筆數
$result = mysql_query("SELECT * FROM table");
$num = mysql_num_rows($result);

// 2. 分頁查詢
$result = mysql_query("SELECT * FROM table ORDER BY id LIMIT $start, $limit");
$numb = mysql_num_rows($result);

// 3. 顯示資料
echo "<table>";
for ($i = 0; $i < $numb; $i++) {
    $val = mysql_result($result, $i, "val");
    $val1 = mysql_result($result, $i, "val1");
    echo "<tr><td>$val</td><td>$val1</td></tr>";
}
echo "</table>";

// 4. 分頁導航生成(簡化版邏輯)
echo "<table><tr><td>頁:</td>";
// 上一區塊連結
if ($s > 20) { ... }
// 頁碼迴圈(每區塊顯示 20 頁)
for ($page = $s; $page < ($num / $limit); $page++) { ... }
// 下一區塊連結
if ($page > 0 && ($page % 20) == 0) { ... }
echo "</tr></table>";
?>

關鍵變數說明

變數含義
$limit每頁筆數
$start資料查詢起始位移(page * limit)
$s分頁導航區塊索引(每區塊 20 頁)
$star當前頁對應的 $start 值,用於判斷是否加連結

現代化重構建議

1. 棄用 mysql_* 函數

改用 PDO 或 MySQLi,採用預處理語句防止 SQL 注入:

$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$stmt = $pdo->prepare("SELECT * FROM table ORDER BY id LIMIT :start, :limit");
$stmt->bindValue(':start', $start, PDO::PARAM_INT);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->execute();

2. 封裝分頁類別

參考 Pager 類別,將計算邏輯與顯示分離。

3. 分頁導航元件化

function renderPagination($currentPage, $totalPages, $baseUrl, $range = 5) {
    $html = "<nav aria-label='Pagination'><ul class='pagination'>";
    // 首頁、上一頁
    if ($currentPage > 1) {
        $html .= "<li><a href='{$baseUrl}page=1'>首頁</a></li>";
        $html .= "<li><a href='{$baseUrl}page=" . ($currentPage - 1) . "'>上一頁</a></li>";
    }
    // 頁碼範圍
    $start = max(1, $currentPage - $range);
    $end = min($totalPages, $currentPage + $range);
    for ($i = $start; $i <= $end; $i++) {
        $class = ($i == $currentPage) ? " class='active'" : "";
        $html .= "<li$class><a href='{$baseUrl}page=$i'>$i</a></li>";
    }
    // 下一頁、末頁
    if ($currentPage < $totalPages) {
        $html .= "<li><a href='{$baseUrl}page=" . ($currentPage + 1) . "'>下一頁</a></li>";
        $html .= "<li><a href='{$baseUrl}page=$totalPages'>末頁</a></li>";
    }
    $html .= "</ul></nav>";
    return $html;
}

4. 前端框架整合

搭配 Bootstrap、Tailwind CSS 或 Vue/React 元件,實現無刷新分頁(AJAX/Fetch)或 SSR 渲染。

效能優化提醒

  • 大資料集避免 SELECT *,僅查詢必要欄位。
  • 加入適當索引(如 id、排序欄位)。
  • 考慮使用 SQL_CALC_FOUND_ROWS + FOUND_ROWS() 或單獨 COUNT(*) 查詢總數。
  • 高流量場景引入快取(Redis/Memcached)緩存分頁結果。

分頁看似簡單,但涉及資料庫效能、使用者體驗、安全性等多面向,建議採用成熟套件(如 illuminate/pagination、knplabs/knp-paginator-bundle)而非手工維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved