Correction status:qualified
Teacher's comments:
1、问答:分页查询的原理与偏移量的计算方法是什么?
答:分页查询的原理就是通过查询语句显示每次查询的记录数量,通过改变条件显示给用户实现分页查询的功能,分页查询中的偏移量的计算方法是:(所要查询页-1)* 每页显示的数量;为什么要减去1呢,因为从数据库查询的数据位置是从0开始算起的,所以就有了这样的公式:$offset = ($nowPage-1)*$num。
2、以下代码是通过面向对象的知识实现分页类(Pge.php)的功能:
<?php //分页类查询 namespace model; class Page { //查询起始偏移量 private $offset; //每页记录数 private $num; //数据库连接对象 private $pdo; //构造方法 public function __construct($num=5) { //初始化每页的记录数 $this->num = $num; //查询起始偏移量:(页码-1)*页数 $this->offset = ($this->getPage()-1)*$this->num; } //连接数据库 public function coonect($type,$host,$dbname,$user,$pass) { try { $this->pdo = new \PDO("{$type}:host={$host};dbname={$dbname}",$user,$pass); } catch (\PDOException $e){ die($e->getMessage()); } } //获取当前页码 public function getPage() { //如果url中存在页码变量p则取之,否则默认为1,即第一页 return isset($_GET['p']) ? $_GET['p'] : 1; } //获取总页数 public function getPages($table){ $stmt = $this->pdo->prepare("SELECT COUNT(*) FROM `{$table}`"); $stmt->execute(); $total = $stmt->fetchColumn(0); return ceil($total/$this->num); } //获取分页数据 public function getData($table){ $sql = "SELECT * FROM `{$table}` LIMIT {$this->offset} , {$this->num};"; $stmt = $this->pdo->prepare($sql); $stmt->execute(); return $stmt->fetchAll(\PDO::FETCH_ASSOC); } } ?>
说明:以上代码是分页类的封装:其中包括数据库连接的方法,获取当前页的方法,后去总页数的方法,获取分页数据的方法。
以下代码是对分页类的实例化以及把获取的分页数据显示到浏览器,并实现首页,末页,上一页,下一页,中间页,及跳转页的功能:
<?php //导入分页类 require './Page.php'; use model\Page; //实例化分页类 $page = new Page(); //链接数据库 $page->coonect('mysql','localhost','db01','root','root'); //获取当前页 $nowPage = $page->getPage(); //获取总页数 $totalPages = $page->getPages('php'); //获取分页数据 $data = $page->getData('php'); ?> <!DOCTYPE html> <html> <head> <title>封装分页类,实现代码复用</title> <meta charset="utf-8"> <style type="text/css"> table,tr,td { border:1px solid black; } table th { background-color: lightgreen; } table { border-collapse: collapse; width: 60%; margin:30px auto; text-align: center; } table caption { font-size:1.5rem; margin-bottom: 15px; } h3 { text-align: center; } h3 a { text-decoration: none; margin-left: 10px; border:1px solid black; display:inline-block; height:30px; min-height: 30px; padding:0 10px; background-color: lightblue; color:black; font-family: 楷体; } h3 a:hover { background-color: black; color:white; } form { display: inline; font-family: 楷体; font-size: 0.8rem; } </style> </head> <body> <table> <caption>员工工资表</caption> <tr> <th>ID</th> <th>name</th> <th>salary</th> </tr> <?php foreach ($data as $row) :?> <tr> <td><?php echo $row['id']?></td> <td><?php echo $row['name']?></td> <td><?php echo $row['salary']?></td> </tr> <?php endforeach;?> </table> <h3> <!-- 当前是第一页的时候,上一页和首页链接应该不显示 --> <?php if($nowPage != 1) : ?> <a href="http://www.whj.com/0910/demo5.php?p=1">首页</a> <a href="http://www.whj.com/0910/demo5.php?p= <?php echo ($nowPage-1 == 0) ? 1 : ($nowPage-1); ?>">上一页</a> <?php endif; ?> <!--生成中间页码--> <!--将当前页码的背景色锁定:当前页码等于GET中的参数p--> <?php for($i=1; $i<=$totalPages; $i++): ?> <a href="http://www.whj.com/0910/demo5.php?p=<?php echo $i ?>" <?php echo ($i == $nowPage) ? 'style="background-color: red;"' : ''; ?> > <?php echo $i ?> </a> <?php endfor; ?> <!--当前已经是最后一页的时候,下一页和最后一页也应该不显示--> <?php if($nowPage != $totalPages) : ?> <a href="http://www.whj.com/0910/demo5.php?p= <?php echo ($nowPage+1)>=$totalPages ? $totalPages : ($nowPage+1); ?>">下一页</a> <a href="http://www.whj.com/0910/demo5.php?p=<?php echo $totalPages; ?>">末页</a> <?php endif; ?> <!--实现页面的快速跳转--> <form action="" method="get"> 第 <select name="p" id=""> <?php for($i=1; $i<=$totalPages; $i++): ?> <!-- 循环输出全部页码,并锁定当前页--> <option value="<?php echo $i; ?>" <?php if($nowPage==$i){ echo 'selected'; } ?> > <?php echo $i; ?> </option> <?php endfor; ?> </select> 页 <button>跳转</button> </form> </h3> </body> </html>
说明:此段代码中最为重要的就是对分页逻辑的处理,如在第一页之前的和最后一页之后的处理,以及中间页通过for循环来实现,最后添加的跳转页面的功能通过form表单提交当前所要跳转的页面,实现页面的跳转。