Blogger Information
Blog 34
fans 1
comment 0
visits 36120
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
分页查询的原理与偏移量的计算方法以及分页查询实现的案例--2018年9月13日12时30分
coolperJie
Original
3697 people have browsed it

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

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments