## 數據庫分頁
分頁是開發中常見的功能,我們來了解一下sp框架自帶的分頁功能。
**findAll()第四個參數**
首先我們可以簡單地通過設置findAll()查找方法的第四個參數$limit,來進行最簡便地分頁操作。
這里是入門教程例子:
function actionIndex(){
// 接收頁碼參數
$page = (int)arg("p", 1);
// 實例化一個guestbook的模型類
$guestbook = new Model("guestbook");
// 用findAll()方法查詢guestbook表的全部數據
$this->records = $guestbook->findAll(null, "createtime DESC", "*", array($page, 3));
// 輸出看看
// dump($this->records);
$this->pager = $guestbook->page;
// dump($this->pager);
$this->display("guestbook.html");
}
我們可以看到分頁的數據通過$guestbook->page取到了。

字段 | 含義
--- | ---
total_count | 符合條件的總記錄數量
page_size | 每頁多少條件記錄
total_page | 總共有多少頁
first_page | 第一頁頁碼
prev_page | 上一頁頁碼
next_page | 下一頁頁碼
last_page | 最后一頁頁碼
current_page | 當前頁頁碼
all_pages | 全部頁碼數組
offset | 查詢位移,等于$limit的第一個參數
limit | 查詢條數,等$limit的第二個參數
模板里面的使用方法:
<{if $pager}>
<nav>
<ul class="pagination pull-right">
<li>
<a href="<{url c="main" a="index" p=$pager.prev_page}>" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<{foreach $pager.all_pages as $p}>
<li<{if $p == $pager.current_page}> class="active"<{/if}>>
<a href="<{url c="main" a="index" p=$p}>"><{$p}></a>
</li>
<{/foreach}>
<li>
<a href="<{url c="main" a="index" p=$pager.next_page}>" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
<{/if}>
**分頁的第三個參數**
$this->records = $guestbook->findAll(null, "createtime DESC", "*", array($page, 3, 10));
這里注意一下分頁的第三個參數,也就是array($page, 3, 10)的10。
它的意義是“分頁顯示范圍”,會影響到上面分頁數據$guestbook->page中的all_pages項。
- 如果當此參數沒有設置時,all_pages是從1開始到最后一頁的頁碼。
- 如果設置了“分頁顯示范圍”參數后,all_pages只有這個顯示范圍那么多個分頁。比如說設置成10,那么all_pages就只有10個項。
- 分頁顯示范圍會根據當前頁碼,自動偏移到適合的頁碼上,讓當前頁碼盡量顯示在頁碼中間,并且也不會發生頁碼太多把頁碼撐開的情況。
**另一種分頁使用方法**
以上第一種分頁方法,僅能在findAll()方法上面實現。
如果需要執行SQL,如query()的復雜SQL查詢。那么就只能通過pager()方法自行計算分頁數據了。
pager()方法:產生分頁數據。
用法:pager($page, $pageSize = 10, $scope = 10, $total)
參數:
- $page,當前頁碼
- $pageSize,每頁多少條紀錄,也就是分頁大小
- $scope,分頁顯示范圍
- $total,總紀錄數
這里可以看到,pager()方法比起前面的findAll()僅僅是多了個$total參數。因為像query()的復雜SQL來說,要自動取得符合條件的總數,是比較困難的事情。所以pager()方法把總數交給開發者自行輸入。
> 反過來說,findAll()在能力范圍內,是可以自動計算出總數的。
所以pager()方法的使用過程是:
1. 通過query()方法,查詢到紀錄總數$total。或者總數可以不確定,順便個100也行。
2. 然后調用pager()方法,輸入4個參數,得到返回的分頁數據。
3. 通過分頁數據中的offset和limit兩個值,可以構造成SQL語句的LIMIT語句,再給到SQL查詢。
4. 最終SQL查詢結果,和分頁數據一起輸入到模板內顯示。
- 自述
- 一、入門教程
- 1. 開始使用SpeedPHP
- 2. Hello World
- 3. 理解MVC
- 4. 制作留言本
- 5. 數據操作及Ajax
- 二、框架概述
- 1. 特色
- 2. 版權及開源協議
- 3. 開發環境
- 4. 編碼版本
- 5. SAE平臺使用
- 三、開發指南
- 1. 開發流程
- 2. 架構及擴展
- 3. 程序目錄結構
- 4. 命名建議
- 5. 安全建議
- 6. 用戶自定義
- 7. 模塊modules
- 四、訪問交互
- 1. 表單提交及數據獲取
- 2. session/cookie的使用
- 3. 偽靜態及URL跳轉
- 4. 使用frameset
- 5. 模板引擎特性和使用方法
- 五、數據操作
- 1. 建立數據模型類
- 2. 數據操作教程
- 3. 分頁
- 4. SQL支持及關聯實現
- 5. 多數據庫、主從庫配置