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

PHP MySQL 分頁類完整實現:支援多種顯示模式與自適應 URL 生成

     編輯:PHP 綜合知識

PHP MySQL 分頁類完整實現:支援多種顯示模式與自適應 URL 生成

分頁功能是 Web 應用的標配組件。一個優秀的分頁類不僅要處理資料庫查詢邏輯,更應提供靈活的前端顯示模式、自動處理 URL 參數、支援自定義樣式。本文呈現一個功能完整、生產可用的 PHP 分頁類 pagelist,涵蓋從資料查詢到 HTML 輸出的全流程。

核心功能特性

  • 多種導航模式:首頁/上一頁/下一頁/末頁圖標、數字頁碼按鈕、下拉選單跳轉、輸入框直接跳轉
  • 智慧型頁碼截斷:當頁碼過多時,自動以當前頁為中心顯示固定數量按鈕(預設 9 個),首尾頁永遠可見
  • 自適應 URL 生成:自動保留當前查詢字串參數(除 page 參數),支援任意查詢條件組合
  • 雙重查詢模式:支援簡單的「表名+條件+排序」快速查詢,也支援複雜自定義 SQL
  • 大資料量優化:內建超過 10,000 筆記錄時自動切換至子查詢分頁模式(延遲關聯)

類結構與關鍵屬性

class pagelist {
    // 分頁參數
    var $page;           // 當前頁碼
    var $page_size = 20; // 每頁筆數
    var $num_btn = 9;    // 數字按鈕顯示個數
    
    // 資料庫與查詢
    var $db;             // 資料庫連線物件
    var $table = array(); // 表配置:tablename, id, orderby, descasc, fileds, where
    var $sql;            // 自定義 SQL
    
    // 統計資訊
    var $total_records;  // 總記錄數
    var $total_pages;    // 總頁數
    
    // 顯示相關
    var $img_path;       // 圖標路徑
    var $img_btn;        // 圖標 HTML
    var $url;            // 分頁基礎 URL
}

關鍵方法解析

1. 建構子與初始化

function __construct() {
    global $db;
    $this->db = $db;
    $tmp_page = intval(trim($_GET["page"]));
    $this->page = empty($tmp_page) ? 1 : $tmp_page;
    $this->set_table();
    $this->page_size = 20;
    $this->num_btn = 9;
    $this->img_path = '/images/';
    $this->img = array("ico_first.gif", "ico_front.gif", "ico_next.gif", "ico_last.gif");
}

自動從 $_GET['page'] 取得當前頁,預設為第 1 頁。初始化預設顯示參數與圖標路徑。

2. 總記錄數統計與總頁數計算

function set_total_records() {
    if ($this->total_records == 0 or !isset($this->total_records)) {
        if (empty($this->count_sql) and !empty($this->table["tablename"])) {
            $sql = "SELECT count(".$this->table["id"].") as count_id 
                    FROM `".$this->table["tablename"]."` 
                    ".($this->table["where"]!="" ? " WHERE ".$this->table["where"] : "");
        } else {
            $sql = preg_replace("/SELECT(.*?)FROM(.*?)/i", 
                       "SELECT count(id) AS count_id FROM\\2", $this->sql);
        }
        $arr = $this->db->row_query_one($sql);
        $this->total_records = $arr["count_id"];
    }
}

function set_show_page() {
    $this->set_img();
    $this->set_url();
    $this->set_total_records();
    if ($this->total_records < $this->page_size) {
        $this->total_pages = 1;
    } else {
        $this->total_pages = ceil($this->total_records / $this->page_size);
    }
    if ($this->page > $this->total_pages) {
        $this->page = $this->total_pages;
    }
}

支援兩種計數方式:基於表配置自動生成 COUNT SQL,或基於自定義 SQL 透過正則轉換。自動修正超出範圍的頁碼。

3. 智慧型 URL 生成

function set_url() {
    $arr_url = array();
    parse_str($_SERVER["QUERY_STRING"], $arr_url);
    unset($arr_url["page"]);
    if (empty($arr_url)) {
        $str = "page=";
    } else {
        $str = http_build_query($arr_url)."&page=";
    }
    $this->url = "https://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]."?".$str;
}

自動保留所有查詢參數(搜尋關鍵字、篩選條件等),僅替換 page 參數,確保分頁連結不丟失查詢上下文。

4. 多樣化導航輸出

類提供模組化的顯示方法,可自由組合:

  • show_first_prv():首頁/上一頁圖標(當前頁為 1 時禁用)
  • show_next_last():下一頁/末頁圖標(當前頁為末頁時禁用)
  • show_num_btn():核心數字按鈕邏輯,實現以當前頁為中心的滑動窗口顯示
  • show_num_select():下拉選單跳轉(總頁數 < 50 時顯示)
  • show_num_text():輸入框 + Go 按鈕直接跳轉
  • show_page_info():顯示「共 X 條 / Y 頁」統計資訊

5. 大資料量自動優化:子查詢分頁

function get_sql() {
    if ($this->total_records > 10000) {
        $this->sql = "SELECT ".$this->table["fileds"]." FROM `".$this->table["tablename"]."` 
            ".($this->table["where"]!="" ? " WHERE ".$this->table["where"].' AND '.$this->table["id"].'>=' : ' WHERE '.$this->table["id"].'>=')
            ."(SELECT ".$this->table["id"]." FROM `".$this->table["tablename"]."` 
              ORDER BY ".$this->table["id"]." LIMIT ".$this->page_size*($this->page-1).", 1)
            ORDER BY ".$this->table["orderby"]." ".$this->table["descasc"]." 
            LIMIT ".$this->page_size;
    } else {
        $this->sql = "SELECT ".$this->table["fileds"]." FROM `".$this->table["tablename"]."` 
            ".($this->table["where"]!="" ? " WHERE ".$this->table["where"] : "")
            ." ORDER BY ".$this->table["orderby"]." ".$this->table["descasc"]
            ." LIMIT ".$this->page_size*($this->page-1).", ".$this->page_size;
    }
    return $this->sql;
}

當總記錄數超過 10,000 筆,自動切換至子查詢模式(延遲關聯),避免大偏移量 LIMIT 的效能陷阱。

使用範例

基本用法(簡單查詢)

<?php
include('db.php');
include('pagelist.php');
$db = new db();
$db->connect($db_config);
header("content-type:text/html;charset=utf-8");

$pl = new pagelist();
$arr = $pl->get_rows('table_name'); // 表名,可選 where、orderby
unset($pl);

echo '<pre style="text-align:left">';
print_r($arr);
echo '</pre>';

// 輸出分頁導航:$arr['page']
// 輸出資料列表:$arr['rows']
// 總筆數:$arr['sum']
?>

複雜查詢(自定義 SQL)

$pl = new pagelist();
$sql = 'SELECT * FROM `wap_article` AS a, `wap_article_info` AS b WHERE a.id=b.articleid';
$arr = $pl->get_rows_sql($sql); // 需自行確保 SQL 包含排序
unset($pl);
// 同樣回傳包含 page、rows、sum 的陣列
?>

CSS 樣式參考

類註釋中包含建議的 CSS 樣式(.page 系列),可直接引用或自定義:

.page { float: left; font: 11px Arial, Helvetica, sans-serif; padding: 6px 0; margin: 0px 10%; margin-top: 10px; }
.page a, .page strong { padding: 2px 6px; border: solid 1px #ddd; background: #fff; text-decoration: none; }
.page a:visited { padding: 2px 6px; border: solid 1px #ddd; background: #fff; text-decoration: none; }
.page .break { padding: 2px 6px; border: none; background: #fff; text-decoration: none; }
.page strong { padding: 2px 6px; border-color: #999; font-weight: bold; font-size: 13px; vertical-align: top; background: #fff; }
.page a:hover { color: #fff; background: #0063DC; border-color: #036; text-decoration: none; }

總結

這個 pagelist 類經過實戰驗證,具備:

  1. 零配置即用:預設值合理,最少一行程式碼啟用分頁
  2. 彈性擴充:支援簡單查詢與複雜 SQL 雙模式
  3. 效能感知:大資料量自動啟用子查詢優化
  4. 前端友善:多種導航模式組合,URL 自適應保留查詢上下文

可直接整合至任何 PHP + MySQL 專案,或作為二次開發基礎進一步封裝為現代框架(Laravel、ThinkPHP 等)的分頁元件。

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