分頁類分析
- <?php
- /* C_page.php
- * $db = new mysql("localhost","root","roort","dbname","utf8"); //實例化數據庫類
- * $sql = "SELECT * FROM article order by article_id desc"; //sql語句
- * $page = new page($sql,7,"index.php?"); //實例化分頁類
- * $sql = $page->pagesql(); //格式化sql語句
- * $result = $db->query($sql);
- * while($row=$db->fetch_array($result)) {
- * echo $row["article_id"].$row["article_title"]."<br />";
- * }
- * echo $page->show(); //輸出html
- * $db->close();
- * ====================================================
- */
- class multipage{
- private $url;
- private $pagesize; //每頁要顯示的記錄數
- private $sql; //sql語句
- private $getpage; //當前頁數
- //參數:sql語句,每頁記錄數,傳遞連接(例如"index.php?"或者"index.php?sort=1&"等)
- //輸出的url爲index.php?page=23或者index.php?type=1&page=2
- //意思爲第23頁或者第1類的第2頁
- //開始初始化
- function __construct($sql,$pagesize,$url) {
- $this->url = $url;
- $this->pagesize = $pagesize;
- $this->sql = $sql;
- $this->getpage = intval( $_GET['page'] ); //page值由url傳遞,例如list.php?page=2
- if(!$this->getpage) { //檢查是否傳遞了page值,若是沒有則設置爲1
- $this->getpage=1;
- }
- }
- //獲取記錄總條數
- function getcount() {
- return mysql_num_rows(mysql_query($this->sql));
- }
- //格式化sql語句
- function pagesql() {
- $nowpage = $this->getpage; //當前頁號
- $limitNumber= $this->pagesize; //每頁記錄數
- if($nowpage<1) { //若是不是合法頁號,則設置爲第一頁,若是超出了最後一頁是否是應該一樣操做????
- $nowpage=1;
- }
- return $this->sql." limit ".($nowpage-1)*$limitNumber.",".$limitNumber;
- //對sql語句處理,加上limit算法 select * from table limit offset,rows
- // 1-10,11-20,21-30
- //如每頁顯示10條,那麼第3頁就要顯示第30-39間的10條,就是 select * from `table` limit 20,10
- }
- //顯示分頁,參數:顯示數字連接個數,偏移量
- //$offset的做用是若是當前頁號是4,那麼分頁條中就會顯示從(4-2=2)開始的5頁的連接
- //那麼,要顯示的練級的頁號就是從2開始到6,即4-2=2到4+5-2-1=6
- //分頁條的結構是 offset+1+(page-offset-1)=page
- function show($page = 5,$offset = 2){ //page是要顯示的數字連接的個數,若是頁數太多,不能所有顯示,只顯示一部分
- $mpurl = $this->url; //默認url,就是除去頁號變量的部分
- $curr_page = $this->getpage; //當前頁號
- $perpage = $this->pagesize; //每頁記錄數
- $num=$this->getcount(); //調用本類中的getcount函數,得到總記錄數
- $multipage = ''; //初始化分頁代碼html內容
- //若是總記錄數大於每頁顯示的記錄數,也就是說一頁以上
- if ($num> $perpage){
- $totalpage = ceil($num / $perpage); //pages總頁數=總記錄數/每頁記錄數
- $from = $curr_page - $offset; //分頁條開始頁號
- $to = $curr_page + $page - $offset - 1; //分頁條結束頁號
- //------------------------------------------------------------------------------------------------
- if ($page> $totalpage){ //若是初始的分頁條顯示的連接數大於 總頁數
- $from = 1; //即 不足以填充滿一個分頁條的狀況下
- $to = $totalpage; //最後一個連接就是總頁數
- }else{
- //------------------------------------------------------------------------------------------------
- //下面討論的是當一個分頁條的連接數不能完整的顯示出全部的頁號時
- //如 上一頁……3 4 5 6 7……下一頁 當前爲第5頁,共有記錄100條,20頁
- //------------------------------------------------------------------------------------------------
- //第一種特殊狀況 如 上一頁 1 2 3 4 5……下一頁 當前爲第1頁的狀況下
- //這樣計算出來的$from<1甚至小於0
- if ($from <1){ //當前頁號是1的時候,若是繼續按照上面的算法,$from頁號會是-1,這要求在$from<1時,從新初始化$from=1
- $to = $curr_page + 1-$from; //計算結束頁號
- //這裏的$from=$curpage - $offset
- //$to爲何要等於$curpage + 1 - $from 呢?
- //這裏的$to的值永遠是$offset+1
- //爲何不直接給$to一個常量或什麼呢?
- $from = 1; //從新設置開始頁號,由於$from<1是不合法的
- if (($to - $from) <$page && ($to - $from) <$totalpage){ //若是分頁條顯示的連接數小於預設值和總頁數
- $to = $page; //結束頁號設置爲$page
- }
- //------------------------------------------------------------------------------------------------
- //下面的狀況是當前頁爲最後頁的狀況,處理同上
- }elseif ($to> $totalpage){ //
- $from = $curr_page - $totalpage + $to; //
- $to = $totalpage; //
- if (($to - $from) <$page && ($to - $from) <$totalpage){ //
- $from = $totalpage - $page + 1; //
- }
- }
- }
- //開始定義輸出
- $multipage .= '<div class="pagebar">';
- $multipage .= '<span>'.$num.'</span>';
- $multipage .= '<span>'.$curr_page.'/'.$totalpage.'</span>';
- if ($curr_page - $offset> 1){
- $multipage .= '<li><a href="'.$mpurl.'page=1" title="首頁">首頁</a></li> ';
- $prev_page =$curr_page-1;
- $multipage .='<li><a href="'.$mpurl.'page='.$prev_page.'title="上一頁">上一頁</a></li> ';
- }
- for ($i = $from; $i <= $to; $i++){
- if ($i != $curr_page){
- $multipage .='<li><a href="'.$mpurl.'page='.$i.'" title="第'.$i.'頁">'.$i.'</a></li> ';
- }else{
- $multipage .= '<li> <span class="pcurpage">'.$i.'</span></li>';//當前頁不用帶超連接
- }
- }
- if ($curr_page + $offset <$totalpage){
- $next_page =$curr_page-1;
- $multipage .='<li><a href="'.$mpurl.'page='.$next_page.'title="下一頁">下一頁</a></li> ';
- $multipage .= '<li><a href="'.$mpurl.'page='.$totalpage.'" title=「尾頁」>尾頁</a></li>';
- }
- $multipage .='</div>';
- }
- return $multipage;
- }
- }
- //輸出結構爲 首頁 上一頁 2 3 4 5 6 下一頁 尾頁
- ?>
歡迎關注本站公眾號,獲取更多信息