24-PHP+MySQL分頁技術詳解

PHP+MySQL分頁技術詳解


今天,咱們來看一下PHP+MySQL的分頁技術!首先,咱們先須要瞭解一下分頁的原理是什麼?


1、分頁的原理


其實,分頁的原理異常簡單,其利用了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條記錄!


2、分頁的過程

若是想實現分頁的過程,那麼必須通過如下幾步:

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">&nbsp;</td>

<td bgcolor="#FFFFFF">&nbsp;</td>

</tr>

<tr>

<td colspan="2" bgcolor="#FFFFFF">

    <?php

       if($rowsNum <= $pageSize)

       {

       echo "1";

       }

       else

       {

           for($i=1;$i<=$pageCount;$i++)

           echo "{$i}&nbsp;&nbsp;";

       }

    ?>

</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}&nbsp;&nbsp;";

       }

    ?>

</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>&nbsp;&nbsp;";

       }

    ?>

</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和不足,咱們慢慢來升級吧!

各位晚安!
相關文章
相關標籤/搜索