用 PHP 實作分頁功能

簡單記錄一下。

簡述

基本的分頁功能有幾個要素:

  • 目前頁數
  • 總頁數
  • 一頁要顯示幾筆資料

只要掌握這些原則就能做出一個很簡單的分頁功能,不過在那之前要先知道怎麼從資料庫裡面撈出正確的資料。

SQL 指令有個關鍵字是 LIMITOFFSET,前者代表「顯示幾筆」後者代表「略過幾筆」。不過有部分的資料庫是用 LIMIT逗號 來表示,例如:

1
2
3
4
-- 0 ~ 4 的資料
SELECT * FROM comments LIMIT 5;
-- 同樣是 0 ~ 4(略過 0 筆,顯示 5 筆)
SELECT * FROM comments LIMIT 0, 5;

但有些資料只支援 OFFSET 的寫法,所以得這樣使用:

1
2
3
4
-- 0 ~ 4 的資料
SELECT * FROM comments LIMIT 5 OFFSET 0;
-- 5 ~ 10 的資料
SELECT * FROM comments LIMIT 5 OFFSET 5;

總之呢,從上面可以看出 LIMIT 是固定的,只要不停地更新 OFFSET 就能產出這樣的規律:

  • OFFSET = 0,顯示 0 ~ 4 的資料
  • OFFSET = 5,顯示 5 ~ 10 的資料
  • OFFSET = 10,顯示 11 ~ 15 的資料
  • OFFSET = 15,顯示 15 ~ 20 的資料

這樣就有分頁效果了。

正式實作

這邊拿留言板來舉例,首先得在首頁宣告一些變數來儲存分頁資訊:

  • page 目前頁數
  • per_page 一頁顯示幾筆資料
  • offset 略過幾筆資料,用來控制頁數
  • total_page 總共有幾頁,用來控制上限值

特別解釋一下 offset 的部分,這需要用到國小數學來設定:

1
$offset = ($page-1) * $per_page;

假設 $page 的初始值為 1,意思是在第一頁的時候要略過 0 筆資料(0 x 5 = 0),第二頁的時候要略過 5 筆資料( 1 x 5),以此類推,接著只要更新 $pageoffset 就會跟著改變,這樣就完成了分頁邏輯。

接著只要搭配 <a href="index.php?page=1"> 帶上 $_GET['page'] 的方式來控制分頁狀態(就像 errorCode 一樣),就可以根據參數值來決定現在要顯示哪些資料。

最後簡單示範一下,其實就是把上面全部組合起來而已:

(這邊只是寫個概念,看的懂就好)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// 一頁顯示 10 筆
$per_page = 10;
// 預設第一頁
$page = 1;
// 去資料庫撈出總共有幾筆資料
$total_count = $conn->query("SELECT COUNT(comments.id) AS total FROM comments");
/*
無條件進位,假設有 11 筆資料,ceil(11 / 10) = 2,得到兩頁
如果用無條件捨去,floor(11 / 10) = 1,這樣就只有一頁,最後那筆被忽略掉了。
*/
$total_pages = ceil($total_count / $per_page)
// 算出 offset,決定等下的 SQL 怎麼下
$offset = ($page-1) * $per_page;
// 最後就可以去撈資料了
$comments = $conn->query("SELECT * FROM comments LIMIT $per_page OFFSET $offset");

?>

最後加上控制用的按鈕就 OK 了:

1
2
3
4
<a class="pagination__button" href="index.php?page=<?php echo 1; ?>">首頁</a>
<a class="pagination__button" href="index.php?page=<?php echo $page - 1;?>">上一頁</a>
<a class="pagination__button" href="index.php?page=<?php echo $page + 1;?>">下一頁</a>
<a class="pagination__button" href="index.php?page=<?php echo $total_page; ?>">最後一頁</a>

以上~

從 PHP 學習權限管理的重要性 mentor-program-day63
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×