24-PHP+MySQL分頁技術詳解

airland發表於2021-09-09


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">&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和不足,我們慢慢來升級吧!

各位晚安!

附件:

©著作權歸作者所有:來自51CTO部落格作者胖豆豆的原創作品,如需轉載,請與作者聯絡,否則將追究法律責任

PHPMySQL資料庫PHP

3


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2820843/,如需轉載,請註明出處,否則將追究法律責任。

相關文章