24-PHP+MySQL分頁技術詳解
PHP+MySQL分頁技術詳解
今天,我們來看一下PHP+MySQL的分頁技術!首先,我們先需要了解一下分頁的原理是什麼?
一、分頁的原理
其實,分頁的原理異常簡單,其利用了MySQL的select語句的limit子句來實現的!
Limit子句的語法結構是:
limit offset,rowCount;
這兩個引數的含義是記錄的偏移值和每次顯示的記錄數,對於每次顯示的記錄數其實就是決定每頁顯示幾條記錄!這個值由開發者來任意決定,當然肯定最小值要大於等於1。
我們來研究一下offset引數,我們先假設一種情況:記錄無限多,而每頁顯示10條記錄,我們來推算一下吧!另外偏移值是從0開始計算的!
當前頁 偏移值
1 0
2 10
3 20
4 30
…
n (n-1) * 10
那麼這就是偏移值的計算公式:
(當前頁碼 – 1 ) * 每頁顯示的記錄數
所以limit引數的使用就變成了
limit (當前頁碼 – 1 ) * 每頁顯示的記錄數,每頁顯示的記錄數
另外,有的朋友可能問了,如果最後一頁不足10條那怎麼辦呢?如果最後一頁不足10條,則將顯示剩餘的全部記錄,也就是說如果總記錄數為63條記錄;每頁顯示10條記錄,那麼第7頁只顯示3條記錄!
二、分頁的過程
如果想實現分頁的過程,那麼必須經過以下幾步:
1. 獲取總記錄數
2. 指定每頁顯示的記錄數
3. 根據1和2來計算出總頁數
4. 分頁顯示記錄
好了,我們一步一步的來實現!
1. 獲取總記錄數
$sql = “select * from test”;
$result = mysql_query($sql);
$rowsNum = mysql_num_rows($result);
mysql_free_result($result);
2. 指定每頁顯示的記錄數
$pageSize = 2;
其實這句話從純粹的PHP角度來講就是給變數賦值!
3. 獲取總頁數
$pageCount = ceil($rowsNum / $pageSize);
好了,最起碼到這裡為止,我們可以來顯示頁碼了!
<?php
$conn = @mysql_connect("localhost","root","ccjsj") || die("伺服器連線錯誤");
@mysql_select_db("test") || die("指定資料庫不存在");
$sql = "select * from test";
$result = mysql_query($sql) ;
$rowsNum = mysql_num_rows($result);
$pageSize = 2;
$pageCount = ceil($rowsNum / $pageSize);
?>
<body>
<table width="850" border="0" cellpadding="5" cellspacing="1" bgcolor="#666666">
<?php if($rowsNum) {?>
<tr>
<td bgcolor="#FFFFFF">編號</td>
<td bgcolor="#FFFFFF">使用者名稱</td>
</tr>
<tr>
<td bgcolor="#FFFFFF"> </td>
<td bgcolor="#FFFFFF"> </td>
</tr>
<tr>
<td colspan="2" bgcolor="#FFFFFF">
<?php
if($rowsNum <= $pageSize)
{
echo "1";
}
else
{
for($i=1;$i<=$pageCount;$i++)
echo "{$i} ";
}
?>
</td>
</tr>
<?php } else { ?>
<tr>
<td bgcolor="#FFFFFF">對不起,資料表中不存在符合條件的記錄!</td>
</tr>
<?php }?>
</table>
執行結果如下:
好了,先顯示記錄內容吧!
<?php
...
...
?>
<body>
<table width="850" border="0" cellpadding="5" cellspacing="1" bgcolor="#666666">
<?php if($rowsNum) {?>
<tr>
<td bgcolor="#FFFFFF">編號</td>
<td bgcolor="#FFFFFF">使用者名稱</td>
</tr>
<?php while($row = mysql_fetch_array($result)){ ?>
<tr>
<td bgcolor="#FFFFFF"><?=$row['id']?></td>
<td bgcolor="#FFFFFF"><?=$row['name']?></td>
</tr>
<?php } ?>
<tr>
<td colspan="2" bgcolor="#FFFFFF">
<?php
if($rowsNum <= $pageSize)
{
echo "1";
}
else
{
for($i=1;$i<=$pageCount;$i++)
echo "{$i} ";
}
?>
</td>
</tr>
<?php } else { ?>
<tr>
<td bgcolor="#FFFFFF">對不起,資料表中不存在符合條件的記錄!</td>
</tr>
<?php }?>
</table>
但執行結果如下:
為什麼結果會是這樣呢?
原因就是在我們現在的結果集是select * from test來的,而應該是select * from test limit X,Y來獲得的!那麼,怎麼才可以得到我們期望的結果集呢,那就要來研究一下頁碼了!因為,我們在前面已經推算過了,所以,我們只要知道使用者單擊的那個連結,那麼就可以根據前面推算的公式來計算偏移值了!
那麼怎麼知道使用者單擊的那個連結呢?如果將頁碼傳遞給自己那不就可以了嗎!好了,就這麼幹吧!
<?php
$conn = @mysql_connect("localhost","root","ccjsj") || die("伺服器連線錯誤");
@mysql_select_db("test") || die("指定資料庫不存在");
$sql = "select * from test";
$result = mysql_query($sql) ;
$rowsNum = mysql_num_rows($result);
$pageSize = 2;
$pageCount = ceil($rowsNum / $pageSize);
$pageno = $_GET["pageno"];
$offset = ($pageno -1) * $pageSize;
$sql .= " limit {$offset},{$pageSize}";
$result = mysql_query($sql);
?>
<body>
<table width="850" border="0" cellpadding="5" cellspacing="1" bgcolor="#666666">
<?php if($rowsNum) {?>
<tr>
<td bgcolor="#FFFFFF">編號</td>
<td bgcolor="#FFFFFF">使用者名稱</td>
</tr>
<?php while($row = mysql_fetch_array($result)){ ?>
<tr>
<td bgcolor="#FFFFFF"><?=$row['id']?></td>
<td bgcolor="#FFFFFF"><?=$row['name']?></td>
</tr>
<?php } ?>
<tr>
<td colspan="2" bgcolor="#FFFFFF">
<?php
if($rowsNum <= $pageSize)
{
echo "1";
}
else
{
for($i=1;$i<=$pageCount;$i++)
echo "<a href="{$_SERVER['PHP_SELF']}?pageno={$i}">{$i}</a> ";
}
?>
</td>
</tr>
<?php } else { ?>
<tr>
<td bgcolor="#FFFFFF">對不起,資料表中不存在符合條件的記錄!</td>
</tr>
<?php }?>
</table>
執行結果如下:
怎麼會錯了呢!仔細一下,原來問題在$_GET[“pageno”],在使用者剛剛訪問該頁碼時,使用者沒有單擊任何的連結,那麼$_GET[‘pageno’]的返回值就是空,而空-1則等於-1,那麼偏移值則等於-1*2,那就成了-2了,所以才會報錯的!那麼只要將初始的頁碼改變1就可以了!
if ($pageno == "") $pageno = 1;
執行結果如下:
好了,今天的話題就先到這兒,其實,這個東西還存在一些bug和不足,我們慢慢來升級吧!
各位晚安!
附件:
©著作權歸作者所有:來自51CTO部落格作者胖豆豆的原創作品,如需轉載,請與作者聯絡,否則將追究法律責任
PHPMySQL資料庫PHP
3
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2820843/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ElasticSearch 深度分頁詳解Elasticsearch
- SAP UI 搜尋分頁技術UI
- Cube 技術解讀 | Cube 小程式技術詳解
- Cube 技術解讀 | Cube 卡片技術棧詳解
- JavaScript數字分頁效果詳解JavaScript
- 分頁機制圖文詳解
- Service Mesh技術詳解
- Web除錯技術詳解Web除錯
- 詳解Vue.js 技術Vue.js
- web前端技術Mongoose詳解Web前端Go
- 文字預處理技術詳解
- Flutter TextField詳解 | 掘金技術徵文Flutter
- Docker之Docker Compose技術詳解。Docker
- WiFi協議技術詳解概述WiFi協議
- CynosDB技術詳解——架構設計架構
- 詳解Android資料儲存技術Android
- PHP 面試詳解之技術篇PHP面試
- Java RMI技術詳解與案例分析Java
- 【INDEX】Oracle分割槽索引技術詳解IndexOracle索引
- SpringBoot下的模板技術Thymeleaf詳解Spring Boot
- 視訊技術詳解:RTMP H5 直播流技術解析H5
- OpenAI Sora 關鍵技術詳解:揭秘時空碎片 (Spacetime Patches) 技術OpenAISora
- 從技術到工具再到落地,Pivotal多位技術專家詳解Greenplum
- iOS Airplay Screen Mirroring 投屏技術詳解iOSAI
- CynosDB技術詳解——儲存叢集管理
- 資料庫連線池技術詳解資料庫
- 詳解TF雲原生技術路線圖
- 大資料技術Hbase和Hive詳解大資料Hive
- 分表技術
- 短視訊技術詳解:Android端的短視訊開發技術Android
- 技術乾貨:LeetCode1- 20題詳解LeetCode
- 詳解Windows 11背後的技術創新Windows
- AIGC神器CLIP:技術詳解及應用示例AIGC
- 萬人連麥的幕後技術詳解
- 阿里技術專家詳解 DDD 系列- Domain Primitive阿里AIMIT
- 「技術層面」詳解供應鏈管理平臺主流技術架構方案架構
- 中文分詞技術中文分詞
- 紅蟻旅遊(分紅)系統開發技術(詳情)