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  「...」 ?>」,有效。

相關文章
相關標籤/搜索