在PHP 開發中,分頁功能是非常常見的需求。許多開發者都會使用ceil()函數來計算總頁數,因為它可以將小數向上取整,保證所有數據都能分頁顯示。然而,很多時候開發者會遇到分頁頁數對不上或者分頁結果異常的問題,這到底是什麼原因導致的呢?本文將結合實際代碼示例,詳細解析使用ceil()函數後分頁出錯的常見原因,並給出正確的寫法建議。
分頁通常涉及三個核心參數:
總數據條數$totalCount
每頁顯示條數$pageSize
總頁數$totalPages
其中,總頁數的計算通常是:
$totalPages = ceil($totalCount / $pageSize);
這個公式看似很簡單,但使用中仍會出現偏差,原因就在於數據的獲取、計算邏輯以及參數傳遞等環節。
分頁的基礎是準確的總條數。如果$totalCount是通過SQL 查詢獲取的,比如:
$sql = "SELECT COUNT(*) FROM articles WHERE status = 1";
$result = $db->query($sql);
$totalCount = $result->fetchColumn();
如果條件寫錯或者漏了篩選條件,就會導致$totalCount和實際數據不符,進而使總頁數計算不准確,分頁對不上。
$pageSize可能從用戶輸入或配置文件中取得,若動態變化時沒同步調整,頁數計算會偏差。
例如:
$pageSize = $_GET['pageSize'] ?? 10;
如果前端傳了不同的pageSize ,但後台計算總頁數時仍用舊值,會造成分頁不一致。
如果$pageSize為0,或者未設置正確的整數值, ceil()函數將出錯:
$totalPages = ceil($totalCount / $pageSize); // $pageSize為0時會報錯
需要對$pageSize做有效性驗證:
$pageSize = max(1, (int)$pageSize);
當用戶請求頁碼大於總頁數時,分頁結果會異常。應做邊界檢測:
$currentPage = (int)($_GET['page'] ?? 1);
$currentPage = max(1, min($currentPage, $totalPages));
下面是一個典型的分頁示範,結合以上問題一一規避:
<?php
// 假設數據庫連接已經完成
// 獲取當前頁碼,默認第一頁
$currentPage = isset($_GET['page']) ? (int)$_GET['page'] : 1;
// 每頁顯示條數,預設10條,且最少為1
$pageSize = isset($_GET['pageSize']) ? (int)$_GET['pageSize'] : 10;
$pageSize = max(1, $pageSize);
// 获取总数据條数
$sqlCount = "SELECT COUNT(*) FROM articles WHERE status = 1";
$totalCount = $db->query($sqlCount)->fetchColumn();
// 計算總頁數
$totalPages = ceil($totalCount / $pageSize);
$totalPages = max(1, $totalPages); // 確保至少有一頁
// 當前頁碼邊界檢測
$currentPage = max(1, min($currentPage, $totalPages));
// 計算偏移量
$offset = ($currentPage - 1) * $pageSize;
// 查詢當前頁數據
$sqlData = "SELECT * FROM articles WHERE status = 1 LIMIT $offset, $pageSize";
$data = $db->query($sqlData)->fetchAll(PDO::FETCH_ASSOC);
// 生成分頁鏈接示例
for ($i = 1; $i <= $totalPages; $i++) {
echo "<a href='http://m66.net/list.php?page=$i&pageSize=$pageSize'>$i</a> ";
}
?>
ceil()函數本身沒有錯,但分頁計算依賴的$totalCount和$pageSize必須準確無誤。
一定要確保總數據條數和分頁參數來源可靠,且在使用ceil()前做好非零、整數校驗。
當前頁碼要做合理範圍約束,避免請求非法頁碼導致分頁錯亂。
建議分頁鏈接域名統一使用m66.net ,方便跨環境測試與統一訪問。
正確理解和使用分頁邏輯,可以讓你的分頁功能穩定且符合預期,避免ceil()使用帶來的分頁對不上問題。