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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 掌握ASP分頁技術詳解
- ElasticSearch 深度分頁詳解Elasticsearch
- MySQL分頁技術總結MySql
- SAP UI 搜尋分頁技術UI
- MySQL的分頁技術總結MySql
- ASP分頁技術原始碼 (轉)原始碼
- JNI技術詳解
- Cube 技術解讀 | Cube 小程式技術詳解
- Cube 技術解讀 | Cube 卡片技術棧詳解
- JavaScript數字分頁效果詳解JavaScript
- 分頁機制圖文詳解
- 自定義分頁標籤詳解
- SQL 注入技術詳解SQL
- oracle flashback技術詳解Oracle
- 防火牆技術詳解防火牆
- Service Mesh技術詳解
- Web除錯技術詳解Web除錯
- 詳解Vue.js 技術Vue.js
- web前端技術Mongoose詳解Web前端Go
- PHP的分頁處理技術和一些常用的技術PHP
- PHP 面試詳解之技術篇PHP面試
- Flutter TextField詳解 | 掘金技術徵文Flutter
- 文字預處理技術詳解
- WiFi協議技術詳解概述WiFi協議
- FCKeditor使用方法技術詳解
- Java NIO 緩衝技術詳解Java
- ProGuard程式碼混淆技術詳解
- Linux技術——lsof命令詳解Linux
- Linux技術——tcpdump命令詳解LinuxTCP
- 資料庫分頁技術大全(超級經典)資料庫
- CynosDB技術詳解——架構設計架構
- 【INDEX】Oracle分割槽索引技術詳解IndexOracle索引
- Tomcat系列之Java技術詳解TomcatJava
- Linux技術——netstat命令詳解Linux
- Docker之Docker Compose技術詳解。Docker
- Java RMI技術詳解與案例分析Java
- 視訊技術詳解:RTMP H5 直播流技術解析H5
- 分表技術