首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP MySQL 分頁類 TVIewPage:輕量級記錄分頁組件

     編輯:MySQL 資料庫相關知識

類設計目標

  • 僅負責分頁邏輯:計算偏移、查總數、讀取當前頁記錄
  • 不封裝數據庫連接,外部傳入已連接的 link_identifier
  • 不輸出 HTML,返回二維數組 $Result[row][field] 供外部渲染

核心屬性

class TVIewPage {
    var $Table;        // 表名
    var $MaxLine;      // 每頁行數
    var $Offset;       // 記錄偏移量 (內部計算)
    var $Total;        // 總記錄數
    var $Number;       // 本頁實際讀取數
    var $Result;       // 二維結果數組 [row][field]
    var $TPages;       // 總頁數
    var $CPages;       // 當前頁碼
    var $Condition;    // WHERE/Order By 片段
    var $PageQuery;    // 分頁鏈接攜帶參數 [['key'=>'v'],...]
}

關鍵方法

// 構造函數
function TVIewPage($TB, $ML, $OF=0) {
    $this->Table = $TB;
    $this->MaxLine = $ML;
    $this->Offset = $OF;
    $this->Condition = "";
}

// 設置查詢條件
function SetCondition($s) { $this->Condition = $s; }

// 設置分頁鏈接參數
function SetPageQuery($key, $value) {
    $this->PageQuery[] = array('key'=>$key, 'value'=>$value);
}

// 核心:讀取當前頁記錄
function ReadList() {
    // 1. 統計總數
    $sql = "SELECT COUNT(*) AS total FROM {$this->Table} {$this->Condition}";
    $res = mysql_query($sql) or die(mysql_error());
    $row = mysql_fetch_assoc($res);
    $this->Total = $row['total'];

    if ($this->Total > 0) {
        // 2. 計算分頁參數
        $this->TPages = ceil($this->Total / $this->MaxLine);
        $this->CPages = ($this->Offset / $this->MaxLine) + 1;

        // 3. 讀取數據
        $sql = "SELECT * FROM {$this->Table} {$this->Condition} 
                LIMIT {$this->Offset}, {$this->MaxLine}";
        $res = mysql_query($sql) or die(mysql_error());
        $this->Number = mysql_num_rows($res);

        // 4. 組裝二維數組
        $this->Result = array();
        while ($row = mysql_fetch_assoc($res)) {
            $this->Result[] = $row;
        }
    }
    return $this->Result;
}

// 生成分頁導航 HTML
function PageBar() {
    if ($this->TPages <= 1) return "";
    $params = "";
    foreach ($this->PageQuery as $p) 
        $params .= "&{$p['key']}={$p['value']}";
    
    $html = "";
    $prev = $this->CPages - 1;
    $next = $this->CPages + 1;
    
    if ($this->CPages == 1) {
        $html .= "首頁 前頁 ";
        if ($this->TPages > 1)
            $html .= "下頁 
                      尾頁";
    } elseif ($this->CPages == $this->TPages) {
        $html .= "首頁 
                  前頁 
                  尾頁 ";
    } else {
        $html .= "首頁 
                  前頁 
                  下頁 
                  尾頁";
    }
    $html .= " 共 {$this->TPages} 頁 第 {$this->CPages} 頁";
    return $html;
}

使用示例

<?php
mysql_connect('localhost', 'root', 'pass');
mysql_select_db('mydb');

$page = new TVIewPage('article', 10);  // 表 article,每頁 10 條
$page->SetCondition("WHERE status=1 ORDER BY id DESC");
$page->SetPageQuery('cat', $_GET['cat']);  // 保留分類參數

$list = $page->ReadList();  // 獲取二維數組

// 渲染數據
foreach ($list as $row) {
    echo "

{$row['title']}

{$row['summary']}

"; } // 輸出分頁條 echo $page->PageBar(); ?>

遷移到 mysqli/PDO 建議

  • 將 mysql_* 替換為 mysqli_*,傳入 $link 參數
  • 使用準備語句綁定 Condition 中的用戶輸入
  • 大數據量改用游標分頁:WHERE id > $lastId LIMIT 10
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved