PHP 網頁讀取 MySQL 資料庫資料,進行分頁顯示 (1) : 基本分頁 (Pagination)
PHP 網頁讀取 MySQL 資料庫資料進行分頁顯示網頁讀取 MySQL 資料庫資料後,讓資料一頁一頁地分頁顯示如下圖:
以下為笨兔土法煉鋼,東找西拼寫出的程式碼,或許有些語法令人堪疑,不過笨兔主要以達到分頁及相關設置為主。對資料分頁相關設計有興趣者,不妨參考一下唄!
若不想自己寫,可用 Bootstrap Table 比較方便,相關用法可參考笨兔的隨手筆記:
範例程式碼:直接以程式碼來說明唄!主要為紅色字部份。
以笨兔網站的 MySQL 資料庫,撈取【學習分享】的資料來做展示,範例設定的 MySQL 相關名稱如下。MySQL 連線部份,可參考笨兔另一篇隨手筆記【db_002】PHP 連接 MySQL 資料庫。
<?php //MySQL 函數寫法
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '12345678';
$dbname = 'pcgame';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connect') ;
mysql_query("SET NAMES 'UTF8'");
mysql_select_db($dbname);
$sql = 'SELECT * FROM learn';
$result = mysql_query($sql) or die('MySQL query error');
//分頁設定
$per_total = mysql_num_rows($result); //計算總筆數
$per = 10; //每頁筆數
$pages = ceil($per_total/$per); //計算總頁數;ceil(x)取>=x的整數,也就是小數無條件進1法
if(!isset($_GET['page'])){ //!isset 判斷有沒有$_GET['page']這個變數
$page = 1;
}else{
$page = $_GET['page'];
}
$start = ($page-1)*$per; //每一頁開始的資料序號(資料庫序號是從0開始)
$result = mysql_query($sql.' LIMIT '.$start.', '.$per) or die('MySQL query error'); //讀取選取頁的資料
$page_start = $start +1; //選取頁的起始筆數
$page_end = $start + $per; //選取頁的最後筆數
if($page_end>$per_total){ //最後頁的最後筆數=總筆數
$page_end = $per_total;
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>喵喵笨兔 ~ PHP 網頁讀取 MySQL 資料庫資料進行分頁顯示</title>
<link href="css/bootstrap-4.0.0-beta 2.min.css" rel="stylesheet">
<script src="js/bootstrap-4.0.0-beta 2.min.js"></script>
</head>
<body>
<h3 align="center"><code>喵喵笨兔 ~ PHP 網頁讀取 MySQL 資料庫資料進行分頁顯示</code></h3>
<div>
<table class="table table-sm">
<thead>
<tr>
<th>分享日期</th>
<th>分類</th>
<th>編號</th>
<th>內容說明</th>
</tr>
</thead>
<tbody>
<?php while($row=mysql_fetch_assoc($result)){ //讀取資料到表格內?>
<tr>
<td><?php echo $row['l_date'] ?></td>
<td><?php echo $row['l_sort'] ?></td>
<td><?php echo $row['l_number'] ?></td>
<td><?php echo $row['l_description'] ?></td>
</tr>
<? } ?>
</tbody>
</table>
</div>
<div class="row">
<div class="col-md-6" align="center">
<?php
//每頁顯示筆數明細
echo '顯示 '.$page_start.' 到 '.$page_end.' 筆 共 '.$per_total.' 筆,目前在第 '.$page.' 頁 共 '.$pages.' 頁';
?>
</div>
<div class="col-md-6" align="center">
<?php
if($pages>1){ //總頁數>1才顯示分頁選單
//分頁頁碼;在第一頁時,該頁就不超連結,可連結就送出$_GET['page']
if($page=='1'){
echo "首頁 ";
echo "上一頁 ";
}else{
echo "<a href=?page=1>首頁 </a> ";
echo "<a href=?page=".($page-1).">上一頁 </a> ";
}
//此分頁頁籤以左、右頁數來控制總顯示頁籤數,例如顯示5個分頁數且將當下分頁位於中間,則設2+1+2 即可。若要當下頁位於第1個,則設0+1+4。也就是總合就是要顯示分頁數。如要顯示10頁,則為 4+1+5 或 0+1+9,以此類推。
for($i=1 ; $i<=$pages ;$i++){
$lnum = 2; //顯示左分頁數,直接修改就可增減顯示左頁數
$rnum = 2; //顯示右分頁數,直接修改就可增減顯示右頁數
//判斷左(右)頁籤數是否足夠設定的分頁數,不夠就增加右(左)頁數,以保持總顯示分頁數目。
if($page <= $lnum){
$rnum = $rnum + ($lnum-$page+1);
}
if($page+$rnum > $pages){
$lnum = $lnum + ($rnum - ($pages-$page));
}
//分頁部份處於該頁就不超連結,不是就連結送出$_GET['page']
if($page-$lnum <= $i && $i <= $page+$rnum){
if($i==$page){
echo $i.' ';
}else{
echo '<a href=?page='.$i.'>'.$i.'</a> ';
}
}
}
//在最後頁時,該頁就不超連結,可連結就送出$_GET['page']
if($page==$pages){
echo " 下一頁";
echo " 末頁";
}else{
echo "<a href=?page=".($page+1)."> 下一頁</a>";
echo "<a href=?page=".$pages."> 末頁</a>";
}
}
?>
</div>
</div>
</body>
</html>
<?php //PDO 函數寫法
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '12345678';
$dbname = 'pcgame';
try{
$dsn = "mysql:host={$dbhost};dbname={$dbname};charset=utf8";
$conn = new PDO($dsn, $dbuser, $dbpass);
//發生錯誤出現錯誤提醒
$conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch (PDOException $e){
//發生錯誤結束資料庫連線並顯示錯誤訊息
die($e -> getMessage());
}
$sql = 'SELECT * FROM learn';
$rs = $conn -> query($sql);
//分頁設定
$per_total = $rs -> rowCount(); //計算總筆數
$per = 10; //每頁筆數
$pages = ceil($per_total/$per); //計算總頁數;ceil(x)取>=x的整數,也就是小數無條件進1法
if(!isset($_GET['page'])){ //!isset 判斷有沒有$_GET['page']這個變數
$page = 1;
}else{
$page = $_GET['page'];
}
$start = ($page-1)*$per; //每一頁開始的資料序號(資料庫序號是從0開始)
$rs = $conn -> query($sql.' LIMIT '.$start.', '.$per); //讀取選取頁的資料
$page_start = $start +1; //選取頁的起始筆數
$page_end = $start + $per; //選取頁的最後筆數
if($page_end>$per_total){ //最後頁的最後筆數=總筆數
$page_end = $per_total;
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>喵喵笨兔 ~ PHP 網頁讀取 MySQL 資料庫資料進行分頁顯示</title>
<link href="css/bootstrap-4.0.0-beta 2.min.css" rel="stylesheet">
<script src="js/bootstrap-4.0.0-beta 2.min.js"></script>
</head>
<body>
<h3 align="center"><code>喵喵笨兔 ~ PHP 網頁讀取 MySQL 資料庫資料進行分頁顯示</code></h3>
<div>
<table class="table table-sm">
<thead>
<tr>
<th>分享日期</th>
<th>分類</th>
<th>編號</th>
<th>內容說明</th>
</tr>
</thead>
<tbody>
<?php while($row = $rs -> fetch(PDO::FETCH_ASSOC)){ //讀取資料到表格內?>
<tr>
<td><?php echo $row['l_date'] ?></td>
<td><?php echo $row['l_sort'] ?></td>
<td><?php echo $row['l_number'] ?></td>
<td><?php echo $row['l_description'] ?></td>
</tr>
<? } ?>
</tbody>
</table>
</div>
<div class="row">
<div class="col-md-6" align="center">
<?php
//每頁顯示筆數明細
echo '顯示 '.$page_start.' 到 '.$page_end.' 筆 共 '.$per_total.' 筆,目前在第 '.$page.' 頁 共 '.$pages.' 頁';
?>
</div>
<div class="col-md-6" align="center">
<?php
if($pages>1){ //總頁數>1才顯示分頁選單
//分頁頁碼;在第一頁時,該頁就不超連結,可連結就送出$_GET['page']
if($page=='1'){
echo "首頁 ";
echo "上一頁 ";
}else{
echo "<a href=?page=1>首頁 </a> ";
echo "<a href=?page=".($page-1).">上一頁 </a> ";
}
//此分頁頁籤以左、右頁數來控制總顯示頁籤數,例如顯示5個分頁數且將當下分頁位於中間,則設2+1+2 即可。若要當下頁位於第1個,則設0+1+4。也就是總合就是要顯示分頁數。如要顯示10頁,則為 4+1+5 或 0+1+9,以此類推。
for($i=1 ; $i<=$pages ;$i++){
$lnum = 2; //顯示左分頁數,直接修改就可增減顯示左頁數
$rnum = 2; //顯示右分頁數,直接修改就可增減顯示右頁數
//判斷左(右)頁籤數是否足夠設定的分頁數,不夠就增加右(左)頁數,以保持總顯示分頁數目。
if($page <= $lnum){
$rnum = $rnum + ($lnum-$page+1);
}
if($page+$rnum > $pages){
$lnum = $lnum + ($rnum - ($pages-$page));
}
//分頁部份處於該頁就不超連結,不是就連結送出$_GET['page']
if($page-$lnum <= $i && $i <= $page+$rnum){
if($i==$page){
echo $i.' ';
}else{
echo '<a href=?page='.$i.'>'.$i.'</a> ';
}
}
}
//在最後頁時,該頁就不超連結,可連結就送出$_GET['page']
if($page==$pages){
echo " 下一頁";
echo " 末頁";
}else{
echo "<a href=?page=".($page+1)."> 下一頁</a>";
echo "<a href=?page=".$pages."> 末頁</a>";
}
}
?>
</div>
</div>
</body>
</html>
分頁顯示相關應用,可參考笨兔其它隨手筆記: