本次分頁查詢的數據庫表emp表主要有empno、ename、job、mgr、hiredate、sal、comm、deptno八個屬性。php
一、由於咱們要查詢的是emp表,emp表是僱員信息表。用oop思想的話,emp是一個實體類(與數據表相映射),所以咱們得先建立一個Emp實體類(文件名爲 Emp.php)。具體代碼以下css
<?php class Emp{ //這裏全部的屬性封裝爲私有屬性,經過get和set方法獲取和設置。 private $empno; private $ename; private $job; private $mgr; private $hiredate; private $sal; private $comm; private $deptno; //__construct()構造函數,方便初始化數據。 public function __construct($empno,$ename,$job,$mgr,$hiredate,$sal,$comm,$deptno){ $this->empno=$empno; $this->ename=$ename; $this->job=$job; $this->mgr=$mgr; $this->hiredate=$hiredate; $this->sal=$sal; $this->comm=$comm; $this->deptno=$deptno; } public function getEmpno(){ return $this->empno; } public function setEmpno($empno){ $this->empno=$empno; } public function getEname(){ return $this->ename; } public function setEname($ename){ $this->ename=$ename; } public function getJob(){ return $this->job; } public function setJob($job){ $this->job=$job; } public function getMgr(){ return $this->mgr; } public function setMgr($mgr){ $this->mgr=$mgr; } public function getHiredate(){ return $this->hiredate; } public function setHiredate($hiredate){ $this->hiredate=$hiredate; } public function getSal(){ return $this->sal; } public function setSal($sal){ $this->sal=$sal; } public function getComm(){ return $this->comm; } public function setComm($comm){ $this->comm=$comm; } public function getDeptno(){ return $this->deptno; } public function setDeptno($deptno){ $this->deptno=$deptno; } } ?>
二、由於這裏要實現分頁,咱們得建立一個分頁類,它屬於VO值對象類(Value Object 用於和視圖相綁定),這個類主要有如下幾個屬性:html
pageSize:每頁顯示的行數;(這裏頁能夠再加一個屬性,記錄共記錄數,我這裏沒有使用)mysql
pageNo:當前是第幾頁;sql
pageTotal:總共多少頁;數據庫
emps:頁面要顯示(查詢出的分頁結果)的數據集。bootstrap
PageResult.php的代碼以下所示:數組
<?php class PageResult { private $pageSize;//每頁顯示的行數 private $pageNo;//第幾頁 private $pageTotal;//總共幾頁 private $emps;//數組,對於本次分頁每一個元素的類型都是Emp。若是後面拓展查詢其它信息分頁顯示時,這裏的每一個元素類型就對應到相對應到類型。 public function __construct($pageSize,$pageNo,$pageTotal,$emps){ $this->pageSize=$pageSize; $this->pageNo=$pageNo; $this->pageTotal=$pageTotal; $this->emps=$emps; } public function getPageSize(){ return $this->pageSize; } public function setPageSize($pageSize){ $this->pageSize=$pageSize; } public function getPageNo(){ return $this->pageNo; } public function setPageNo($pageNo){ $this->pageNo=$pageNo; } public function getPageTotal(){ return $this->pageTotal; } public function setPageTotal($pageTotal){ $this->pageTotal=$pageTotal; } public function getEmps(){ return $this->emps; } public function setEmps($emps){ $this->emps=$emps; } } ?>
三、我這裏爲了熟悉接口的定義,使用了一下接口(文件名爲 IPageDao.php)。既然有了接口,後面就必須會有接口到實現類。函數
<?php interface IPageDao{ public function page ($pageNo,$pageSize); } ?>
四、我這裏由於第三步使用了接口(文件名爲 PageDaoImp.php),因此這裏是該接口的實現類。在實現類中,主要是實現接口中的方法。這裏主要是查詢數據庫。oop
<?php include "IPageDao.php";//引入接口文件 include "PageResult.php";//引入VO(值對象)類 include "Emp.php";//引入Emp實體類 class PageDaoImp implements IPageDao{ public function page ($pageNo,$pageSize){ //數據庫相關的鏈接信息 $host="localhost:3306"; $user="root"; $pass=""; $db="scott"; //每頁首行索引 $rowIndex=($pageNo-1)*$pageSize; //鏈接數據庫 $conn=mysqli_connect($host,$user,$pass,$db); if ($conn) {//若是鏈接成功 $rset=mysqli_query($conn,"select * from emp limit {$rowIndex},{$pageSize}");//按照分頁要求返回查詢結果集 if($rset){//查詢成功 while($row=mysqli_fetch_row($rset)){//循環查詢結果集 //將查詢結果每行數組,構形成Emp實體對象,並添加到emps[]數組中 $emps[]=new Emp($row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7]); } }else{//查詢失敗 echo "query error"; } $rset02=mysqli_query($conn,"select count(*) from emp");//查詢該表中全部數據行數(總記錄數) $row02=mysqli_fetch_row($rset02); $pageTotal=Ceil($row02[0]/$pageSize);//記錄本次分頁的總頁數 mysqli_close($conn);//關閉鏈接 }else{//若是鏈接失敗 echo "failures"; } $pageResult=new PageResult($pageSize,$pageNo,$pageTotal,$emps);//構造PageResult VO(值對象),存放全部查詢以及分頁相關的信息。 return $pageResult;//返回pageResult 結果對象(VO) } } ?>
五、顯示查詢結果頁(pageTest.php)
<?php header("content-type: text/html;charset=utf-8"); include "PageDaoImp.php";//引入pageDao的實現類 $pageDao=new PageDaoImp();//建立PageDaoImp對象的實例$pageDao $pageSize=$_GET["ps"]?(int)$_GET["ps"]:5;//獲取內置對象$_GET中ps(我這裏ps表示的是pageSize)參數的值,若是存在,$pageSize值就爲該值(使用int強制將字符串類型轉化爲int類型);若是不存在,默認爲5。這裏使用 三目運算符 " ? : "。 $pageNo=$_GET["pn"]?(int)$_GET["pn"]:1;//同理,設置$pageNo的值 $result=$pageDao->page($pageNo,$pageSize);//調用$pageDao中的page(分頁)方法,並將結果返回給$result。由於page()方法返回值是pageResult類型,因此,此時$result也是pageResult類型。 $emps=$result->getEmps();//調用$result中getEmps()方法,獲取Emps屬性值。此時,$emps是一個數組,每一個元素是一個Emp對象的實例 $totalPage=$result->getPageTotal();//調用$result中getPageTotal()方法,獲取pageTotal的屬性值,分頁顯示的總頁數 ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>分頁查詢</title> <link rel="stylesheet" type="text/css" href="../../bootstrap.min.css"> <script> window.onload=function(){ var pageNo=<?=$result->getPageNo() ?>;//當前頁碼 if(pageNo==1){//當 當前頁碼爲1(首頁)時,設置首頁、上一頁兩個按鈕不可點擊 document.getElementById("indexPage").setAttribute("disabled", "disabled"); document.getElementById("prePage").setAttribute("disabled", "disabled"); } if(pageNo==<?=$totalPage ?>){//當 當前頁碼爲末頁時,設置末頁、下一頁兩個按鈕不可點擊 document.getElementById("nextPage").setAttribute("disabled", "disabled"); document.getElementById("endPage").setAttribute("disabled", "disabled"); } }; </script> </head> <body> <div class="container"> <!-- 設置每頁顯示幾條數據的表單 --> <form action="pageTest.php" class="form-inline pull-right" style="margin-top: 50px;margin-bottom: 10px"> <div class="form-group"> <input type="text" class="form-control" name="ps" value="<?=empty($_SERVER["argv"])?"":$pageSize ?>" placeholder="設置每頁顯示行數"> </div> <button type="submit" class="btn btn-info">確認</button> </form> <!-- 分頁顯示的表格 --> <table class="table table-striped table-bordered table-hover"> <tr> <th>序號</th> <?php echo "<th>EMPNO</th><th>ENAME</th><th>JOB</th><th>MGR</th><th>HIREDATE</th><th>SAL</th><th>COMM</th><th>DEPTH</th>"; ?> </tr> <?php // 循環變了$emp數組,並在也門上顯示出來 foreach ($emps as $key => $value) { echo "<tr>"; echo "<td>",$key+$pageSize*($pageNo-1)+1,"</td>"; echo "<td>{$value->getEmpno()}</td>"; echo "<td>{$value->getEname()}</td>"; echo "<td>{$value->getJob()}</td>"; echo "<td>{$value->getMgr()}</td>"; echo "<td>{$value->getHiredate()}</td>"; echo "<td>{$value->getSal()}</td>"; echo "<td>{$value->getComm()}</td>"; echo "<td>{$value->getDeptno()}</td>"; echo "</tr>"; } ?> <tr> <td colspan="9"> <div class="pull-right"> <!-- 首頁、上一頁 當前頁/總頁書 下一頁、末頁 幾個按鈕--> <input type="button" class="btn btn-info" value="首頁" id="indexPage" onclick="window.location='pageTest.php?ps=<?=$pageSize ?>'"/> <input type="button" class="btn btn-info" value="上一頁" id="prePage" onclick="window.location='pageTest.php?pn=<?=$pageNo-1 ?>&ps=<?=$pageSize ?>'"/> <span>第<?=$pageNo ?>頁/共<?=$totalPage ?>頁</span> <input type="button" class="btn btn-info" value="下一頁" id="nextPage" onclick="window.location='pageTest.php?pn=<?=$pageNo+1 ?>&ps=<?=$pageSize ?>'"/> <input type="button" class="btn btn-info" value="末頁" id="endPage" onclick="window.location='pageTest.php?pn=<?=$totalPage ?>&ps=<?=$pageSize ?>'"/> </div> </td> </tr> </table> </div> </body> </html>
至此,使用oop思想重構分頁顯示已經完成。本次案例中頁面的引入使用的是include的關鍵字,也可使用require關鍵字。
注意:
一、我本案例是在Mac系統上完成,由於Mac系統上notice提示被自動屏蔽,因此我在window上運行本代碼時候發現,在「 五、顯示查詢結果頁(pageTest.php)」中,對於一些空值判斷,如$pageSize=$_GET["ps"]?(int)$_GET["ps"]:5,會有notice提示。建議使用empty()函數,改成 $pageSize=empty($_GET["ps"])?5:(int)$_GET["ps"],此時沒有notice提示。
二、不知道什麼緣由,我在個人window系統下,「<?= ?>"解析不了(pageTest.php頁面中用了不少),不得已改爲了「<?php echo 「...」 ?>」,有效。