本次分页查询的数据库表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 “...” ?>”,有效。