博客列表 >分页查询的原理与偏移量的计算方法以及分页查询实现的案例--2018年9月13日12时30分

分页查询的原理与偏移量的计算方法以及分页查询实现的案例--2018年9月13日12时30分

coolperJie
coolperJie原创
2018年09月13日 13:06:023696浏览

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表单提交当前所要跳转的页面,实现页面的跳转。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议