php中用面向对象的思想(oop)重构分页显示

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

相关文章
相关标签/搜索