文章是重點是講php中的分頁原理,同時我們是利用一個實現來講解如何在php中實現分頁,這個就是基于自己寫的留方板程序了,有需要的朋友可以參考一下,很適合于初學者哦。
分頁的關鍵問題其實在于Mysql的一個關鍵字limite這個關鍵字后邊跟的兩個數字,第一個是需要記錄的開始行數,第二個數字是從這個開始行數后取得幾行記錄——這一點大家不要誤以為是從第幾行開始到第幾行結束,相差很遠的。
看看我們index.php的第19行,代碼如下:
$recordSql = $sql. ” LIMIT “.$page*$pagesize.”,”.$pagesize;
其中變量$page的判斷在程序的第8行和第9行得到的,代碼如下:
if(isset($_GET['page'])&&$_GET['page']!=”) $page=$_GET['page'];
else $page=0;
當然大家也看到了$_GET['page']變量這個下文會說到,變量$pagesize我們在第7行自己定義的,也就是每頁顯示多少條記錄,我們定義的是10條,當變量$page=0的時候我們語句最終會是這樣的,代碼如下:
- $recordSql = "SELECT a . * , b.name, b.email, b.qq, c.revert_time, c.revert
- FROM post a
- LEFT JOIN revert c ON ( a.id = c.post_id ) , guest b
- WHERE a.guest_id = b.id
- ORDER BY a.id DESC
- " LIMIT 0,10";
就是從0條記錄開始取得10個記錄結果——這個是包括第0條記錄的;
當$page=1的時候呢?可想而知了——這個時候$page*$pagesize=10,當然是從……不說了,再說就羅嗦了。
還有需要說的是,為什么我們要在取得總行數之后才加上這個limit呢,很簡單嘛,如果我們在取得結果記錄數的時候就加上這個limit,我們總行數永遠不會大于10,因為加上之后他最多返回的記錄數就是10啊兄弟。——這個顯然不符合實際情況,所以我們在執行了,代碼如下:
mysql_num_rows(mysql_query($sql));
取得總記錄數,之后才加上limit關鍵字的,好了我們已經取得了總記錄數,設置了每頁顯示的記錄數10,現在我們需要的就只有總頁數了,這個小學的問題我就不說了吧?當然是總記錄數除以每頁顯示的數就是總頁數了——當然也有除不盡的時候,例如總記錄數11每頁顯示10個,我們需要分幾頁呢?當然是兩頁呢,怎么才能讓11/10=2呢?——顯然是錯誤的,但是實際生活就這樣并不是完美的數學。使用ceil函數啊,看看我們現在有什么了啊,代碼如下:
總記錄數,$numRecord = mysql_num_rows(mysql_query($sql));
總頁數,$totalpage = ceil($numRecord/$pagesize);
我們什么都不缺了,就差如何顯示“上一頁下一頁”了,很簡單,兩個判斷就搞定了,看index.php的159-163行,第160行,代碼如下:
if($page>0) echo "<a href=index.php?page=".($page-1).">上一頁|</a>" ;
如果變量$page>0的話,也就是當前的頁碼大于0說明有上一頁,那么就顯示“上一頁”的鏈接,這個鏈接里面的$page需要減一,例如當前頁是2,那么上一頁當然是1了是不是,當我們點擊上一頁的時候,隨著這個鏈接將會把page=1傳遞過去,這種依靠鏈接傳遞變量的方式就是get方法。 這就回到了程序8行9行進行處理了。
在161行,我們做的判斷是,如果當前頁數小于總記錄數-1——因為我們的頁碼是從0開始的,所以總記錄數要減一進行判斷才符合實際。如果這個判斷成立,說明還有下一頁,下一頁的時候$page當然要加一了。
好了整個分頁就是這樣了,只要記住,如何取得總記錄數,如何為sql語句加上limit關鍵字,如何判斷顯示上下頁,一切都ok了,完整的代碼如下:
- $pagesize = 10;//每一頁顯示多少留言記錄
- if(isset($_GET['page'])&&$_GET['page']!='') $page=$_GET['page'];
- else $page=0;
- $sql = "SELECT a . * , b.name, b.email, b.qq, c.revert_time, c.revert
- FROM post a
- LEFT JOIN revert c ON ( a.id = c.post_id ) , guest b
- WHERE a.guest_id = b.id
- ORDER BY a.id DESC";
- $numRecord = mysql_num_rows(mysql_query($sql));
- $totalpage = ceil($numRecord/$pagesize);
- $recordSql = $sql. " LIMIT ".$page*$pagesize.",".$pagesize;
- $result = mysql_query($recordSql);
- <table width="800" border="0" align="center" bgcolor="#fefefe">
- <?php
- while($rs=mysql_fetch_object($result)){
- ?>
- <tr>
- <td class="tdhx">留言人:<?php echo $rs->name?> |Email:<?php echo $rs->email?>|QQ:<?php echo $rs->qq?>|留言時間:<?php echo date("Y-m-d H:i:s",$rs->post_time+8*3600)?></td>
- </tr>
- <?php
- if(isset($_SESSION['login'])&&$_SESSION['login']){
- ?>
- <tr>
- <td class="tdhx"><a href="revert.php?id=<?php echo $rs->id?>">回復</a> | <a href="delete.php?id=<?php echo $rs->id?>">刪除</a></td>
- </tr>
- <?php
- }
- ?>
- <tr>
- <td>留言內容:<?php echo nl2br(htmlspecialchars($rs->post))?><br/>
- <font color="Red">
- 回復內容:<?php echo nl2br(htmlspecialchars($rs->revert))?>[<?php if($rs->revert_time!="") echo date("Y-m-d H:i:s",$rs->revert_time+8*3600)?> ]
- </font>
- </td>
- </tr>
- <tr><td height="3px" bgcolor="##FF6600"></td></tr>
- <?php
- }
- ?>
- </table>
- <table width="800" border="0" align="center" bgcolor="#B1C3D9">
- <tr>
- <td >
- <?php
- if($page>0) echo "<a href='index.php?page=".($page-1)."'>上一頁|</a>" ;
- if($page<$totalpage-1) echo "<a href='index.php?page=".($page+1)."'>下一頁</a>" ;
- ?></td>
- </tr>
- </table>
新聞熱點
疑難解答