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

PHP 通用分頁函數庫:自動計算總頁數與產生導航

     編輯:PHP 綜合知識

核心函數:genpage()

<?php
function genpage(string &$sql, int $pageSize = 10): void
{
    global $pages, $sums, $eachpage, $page;
    
    $page = max(1, (int)($_GET['page'] ?? 1));
    $eachpage = $pageSize;
    
    // 從原 SQL 解析出 FROM 子句以降後,組成 COUNT(*) 查詢
    $fromPos = stripos($sql, ' from ');
    if ($fromPos === false) {
        die('SQL 缺少 FROM 子句');
    }
    $countSql = 'SELECT COUNT(*) AS total' . substr($sql, $fromPos);
    
    $res = mysql_query($countSql) or die(mysql_error());
    $row = mysql_fetch_array($res);
    $sums = (int)$row[0];
    
    $pages = max(1, (int)ceil($sums / $eachpage));
    if ($page > $pages) $page = $pages;
    
    $offset = ($page - 1) * $eachpage;
    $sql .= " LIMIT $offset, $eachpage";
}
?>

顯示函數:showpage()

function showpage(): void
{
    global $pages, $sums, $eachpage, $page;
    
    $link = $_SERVER['PHP_SELF'];
    echo "記錄 $sums : $eachpage ";
    echo "頁數 $page / $pages ";
    
    $start = max(1, $page - 5);
    $end   = min($pages, $page + 5);
    
    echo "[<a href='$link?page=1'>首頁</a>] ";
    for ($i = $start; $i <= $end; $i++) {
        if ($i === $page) {
            echo "<b><strike>[$i]</strike></b> ";
        } else {
            echo "<a href='$link?page=$i'>[$i]</a> ";
        }
    }
    echo "[<a href='$link?page=$pages'>末頁</a>]";
}

使用範例

<?php
$sql = "SELECT * FROM articles WHERE status = 1 ORDER BY id DESC";
genpage($sql, 15); // 修改 $sql 加上 LIMIT
$res = mysql_query($sql);

while ($row = mysql_fetch_assoc($res)) {
    echo $row['title'] . '<br>';
}

showpage();
?>

⚠️ 重要警示

  • mysql_* 函數已於 PHP 7.0 移除,現代專案請改用 PDO 或 mysqli
  • 直接拼接 SQL 存在注入風險,請使用預處理語句
  • 全域變數耦合度高,建議封裝為類別

現代 PDO 版分頁類別

class Pager
{
    public function __construct(private PDO $pdo, private int $perPage = 15) {}
    
    public function paginate(string $baseSql, array $params = [], int $page = 1): array
    {
        $page = max(1, $page);
        $offset = ($page - 1) * $this->perPage;
        
        // 總筆數
        $countSql = preg_replace('/^SELECT .+ FROM/i', 'SELECT COUNT(*) FROM', $baseSql);
        $stmt = $this->pdo->prepare($countSql);
        $stmt->execute($params);
        $total = (int)$stmt->fetchColumn();
        
        // 分頁資料
        $dataSql = $baseSql . " LIMIT ?, ?";
        $stmt = $this->pdo->prepare($dataSql);
        $allParams = array_merge($params, [$offset, $this->perPage]);
        $stmt->execute($allParams);
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        return [
            'data' => $rows,
            'current_page' => $page,
            'per_page' => $this->perPage,
            'total' => $total,
            'last_page' => max(1, (int)ceil($total / $this->perPage)),
        ];
    }
    
    public function renderLinks(array $pager, string $urlPattern): string
    {
        $html = '';
        for ($i = 1; $i <= $pager['last_page']; $i++) {
            $class = $i === $pager['current_page'] ? 'active' : '';
            $html .= "<a class='$class' href='" . sprintf($urlPattern, $i) . "'>$i</a> ";
        }
        return $html;
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved