程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php中分頁程序之基於留言板詳解

php中分頁程序之基於留言板詳解

編輯:關於PHP編程

文章是重點是講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>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved