上一节中,我们了解到通过循环可以获取一个查询的所有数据,在实际应用中,我们并不希望一次性
获取数据表中的所有数据,那样性能会非常的低,
因此会使用翻页功能,每页仅显示10条或者20条数据。通过mysql的limit可以很容易的实现分页,limit m,n表示从m行后取n行数据,
在PHP中我们需要构造m与n来实现获
取某一页的所有数据。假定当前页为$page,每页显示$n条数据,那么m为当前页前面所有的数据,
既$m = ($page-1) * $n,在知道了翻页原理以后,
那么我们很容易通过构造SQL语句在PHP中实现数据翻页。$page = 2;
$n = 2;
$m = ($page - 1) * $n;
$sql = "select * from user limit $m, $n";
$result = mysql_query($sql);
//循环获取当前页的数据
$data = array();
while ($row = mysql_fetch_assoc($result)) {$data[] = $row;
}
在上面的例子中,我们使用了$m与$n变量来表示偏移量与每页数据条数,
但我们推荐使用更有意义的变量名来表示,
比如$pagesize, $start, $offset等,
这样更容易理解,有助于团队协作开发。

1.翻页改进:

empList.php<html>
<head><meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head><body>
<?phprequire_once 'EmpService.class.php';
//显示所有用户的信息(表格)
//查询数据库
$mysqli = new MySQLi('localhost','root','123456','test');
if($mysqli->connect_error){die('connect error' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8') or die($mysqli->error);$pageSize = 6;
$rowCount = 0;
$pageNow = 1;if(!empty($_GET['pageNow'])){$pageNow = $_GET['pageNow'];
}//创建 EmpService 对象实例
$empService = new EmpService();
//调用 getPageCount 方法,获取到共有多少页
$pageCount = $empService->getPageCount($pageSize);
//调用getEmpListBYPage 获取到应当显示的雇员列表
$res2 = $empService->getEmpListByPage($pageNow,$pageSize);/*$sql = "select * from emp limit " . ($pageNow - 1)*$pageSize . ",$pageSize";*///var_dump($sql);die();//$sql = "select * from emp limit 0,2;";
//$res2 = $mysqli->query($sql);
if(!$res2){die($mysqli->error);
}
while($row = $res2->fetch_row()){$rows[] = $row;
}$res2->free();
$mysqli->close();
?>
<h1>雇员信息列表</h1>
<table border="1" cellpadding="0" cellspacing="0" width="80%"><tr><th>id</th><th>name</th><th>grade</th><th>email</th><th>salary</th><th>操作</th></tr><?php foreach($rows as $row):?><tr><td><?php echo $row[0];?></td><td><?php echo $row[1];?></td><td><?php echo $row[2];?></td><td><?php echo $row[3];?></td><td><?php echo $row[4];?></td><td><a href="">删除用户</a>|<a href="">修改用户</a></td></tr><?php endforeach;?>
</table>
<?php
if($pageNow>1){$prePage = $pageNow-1;echo "<a href='empList.php?pageNow=$prePage'>上一页</a>&nbsp;&nbsp;";
}
echo "当前页{$pageNow}/共{$pageCount}&nbsp;&nbsp;";
if($pageNow<$pageCount){$nextPage = $pageNow+1;echo "<a href='empList.php?pageNow=$nextPage'>下一页</a>&nbsp;&nbsp;";
}//可以使用 for 打印超链接$start = floor($pageNow/10)*10+1;
$end = (floor($pageNow/10)+1)*10;
//var_dump($start);var_dump($end);var_dump($pageNow);die();for($start;$start<=$end;$start++){echo "<a href='empList.php?pageNow=$start'>[$start]</a>";
}//整体向前翻10页
$backup = $pageNow-10;
echo "&nbsp;&nbsp;&nbsp;<a href='empList.php?pageNow=$backup'><<<</a>";//整体向后翻10页
$fordword = $pageNow+10;
echo "&nbsp;&nbsp;&nbsp;<a href='empList.php?pageNow=$fordword'>>>></a>";
echo "<br/><br/>";
?><form action="">跳转到:<input type="text" name="pageNow"/><input type="submit" value="Go"><form><?php/*    //打印出页码的超链接for($i=1;$i<=$pageCount;$i++){echo "<a href='empList.php?pageNow=$i'>$i</a>&nbsp;&nbsp;";}*/?></body>
</html>

封装:

SqlHelper.class.php<?phpclass SqlHelper{public $conn;public $dbname = 'test';public $username = 'root';public $password = '123456';public $host = 'localhost';public function __construct(){$this->conn = new MySQLi($this->host,$this->username,$this->password,$this->dbname);if($this->conn->connect_error){die('connect error:' . $this->conn->connect_error);}}//执行 dql 语句public function execute_dql($sql){$res = $this->conn->query($sql) or die($this->conn->error);return $res;}public function execute_dql2($sql){$arr = array();$res = $this->conn->query($sql) or die($this->conn->error);//把$res = >$arrwhile($row = $res->fetch_row()){$arr[] = $row;}//这里就可以立即关闭资源$res->free();return $arr;}//考虑分页情况的查询// $sql1 = "select * from where 表名 limit 0,6"// $sql2 = "select count(id) from 表名";public function execute_sql_fenye($sql1,$sql2,&$fenyePage){//这里我们查询了要分页显示的数据$res = $this->conn->query($sql1) or die($this->conn->error);//$res=>array();$arr = array();while($row = $res->fetch_row()){$arr[] = $row;}$res->free();$res2 = $this->conn->query($sql2);if($row = $res2->fetch_row()){$fenyePage->pageCount = ceil($row[0]/$fenyePage->pageSize);$fenyePage->rowCount = $row[0];}$res2->free();//把导航信息也分装到 fenyePage 信息中$navigate = '';if($fenyePage->pageNow>1){$prePage = $fenyePage->pageNow-1;$navigate = "<a href='empList.php?pageNow=$prePage'>上一页</a>&nbsp;&nbsp;";}$navigate .= "当前页{$fenyePage->pageNow}/共{$fenyePage->pageCount}&nbsp;&nbsp;";if($fenyePage->pageNow<$fenyePage->pageCount){$nextPage = $fenyePage->pageNow+1;$navigate .= "<a href='empList.php?pageNow=$nextPage'>下一页</a>&nbsp;&nbsp;";}$fenyePage->navigate = $navigate;$fenyePage->res_array = $arr;}//执行 dml 语句public function execute_dml($sql){$b = $this->conn->query($sql);if(!$b){return 0;}else{if($this->conn->affected_rows>0){return 1;}else{return 2; //没有行受影响}}}//关闭连接的方法public function close_connect(){if(!empty($this->conn)){}}
}
EmpService.class.php<?php//一个函数可以获取共有多少页require_once 'SqlHelper.class.php';class EmpService
{function getPageCount($pageSize){//需要查询 $rowCount$sql = "select count(id) from emp;";$sqlHelper = new SqlHelper();$res = $sqlHelper->execute_dql($sql);//这样就可以计算 $pageCountif($row = $res->fetch_row()){$pageCount = ceil($row[0]/$pageSize);}//释放资源$res->free();//关闭连接$sqlHelper->close_connect();return $pageCount;}//一个函数可以获取应当显示的雇员信息public function getEmpListByPage($pageNow,$pageSize){$sql = "select * from emp limit " . ($pageNow - 1)*$pageSize . ",$pageSize";$sqlHelper = new SqlHelper();$res = $sqlHelper->execute_dql($sql);//关闭连接$sqlHelper->close_connect();return $res;}//第二种使用封装的方式完成的分页(业务逻辑到这里)function getFenyePage(&$fenyePage){//创建一个 SqlHelper 对象实例$sqlHelper = new SqlHelper();$sql1 = "select * from emp limit " . ($fenyePage->pageNow-1)*$fenyePage->pageSize . ",$fenyePage->pageSize;";$sql2 = "select count(id) from emp;";$sqlHelper->execute_sql_fenye($sql1,$sql2,$fenyePage);$sqlHelper->close_connect();}
}
FenyePage.php
<?phpclass FenyePage
{public $pageSize = 6;public $res_array;//显示数据public $rouCount ;//这是从数据库中获取public $pageNow;//用户指定public $pageCount;//这个是计算得到的public $navigate;  //分页导航}
empList.php<html>
<head><meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head><body><h1>雇员信息列表</h1>
<?php
require_once 'EmpService.class.php';
require_once 'FenyePage.php';//创建一个 FenyePage 对象实例$fenyePage = new FenyePage();
//给 fenyePage指定必须的数据
$fenyePage->pageNow = 1;
$fenyePage->pageSize = 6;if(!empty($_GET['pageNow'])){$fenyePage->pageNow = $_GET['pageNow'];
}$empService = new EmpService();
//该方法可以把fenyePage完成
$empService->getFenyePage($fenyePage);
?><table border="1" cellpadding="0" cellspacing="0" width="80%"><tr><th>id</th><th>name</th><th>grade</th><th>email</th><th>salary</th><th>操作</th></tr><?php foreach($fenyePage->res_array as $row):?><tr><td><?php echo $row[0];?></td><td><?php echo $row[1];?></td><td><?php echo $row[2];?></td><td><?php echo $row[3];?></td><td><?php echo $row[4];?></td><td><a href="">删除用户</a>|<a href="">修改用户</a></td></tr><?php endforeach;?>
</table><?phpecho $fenyePage->navigate;//输出上一页,下一页?></body>
</html>

66. 查询分页数据相关推荐

  1. 分页数据做缓存的思考

    当我们进行java开发时,当遇到页面数据过多或者复杂,会有很多慢sql,此时除了优化sql外,还可以通过缓存的方式来处理: 有如下方案: 1.整个页面做缓存,key为页数,value为整个页面的数据 ...

  2. php查询mysql表里的数据_PHP/MYSQL 查询大数据/遍历表

    PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50) MYSQL:5.1.51 如果我们有的一张表有几百万或几千万的记录,我们要使用 PHP 将所有的记录 ...

  3. 适合千万数据查询分页操作的一个通用存储过程

    适合千万数据查询分页操作的一个通用存储过程 一.引言                最近上班比较忙,所以就很少写东西了,MongoDB系列的文章也要拖后了,没办法,工作第一,没工作就没饭吃了.今天正好 ...

  4. Bootstrap4+MySQL前后端综合实训-Day06-PM【MD5加码-生成32位md5码、ResultData.java、分页查询用户数据、添加用户按钮的实现】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目录 MD5加码 生成32位md5码 ResultData.java 分页查询 ...

  5. 分页查询有数据无数据源问题

    分页查询有数据无数据源问题 使用前端查询有数据但无数据源问题 问题详情 具体问题演示 代码演示 解决办法 使用前端查询有数据但无数据源问题 问题详情 表格有自带的分页功能,后台分页主要是通过传{lim ...

  6. 黑马旅游网——分页数据展示(难点)和旅游线路名称查询

    狗都能看懂的代码分析!!!,虽然这一块比较绕但是我还是决定让狗都能看懂 期望效果: 数据展示功能: 当我们点击分页展示栏中任意一页时,就会展示相应板块(cid)的数据 如我们点击国内游(cid=5), ...

  7. SQL数据库查询LIMIT 数据分页

    SQL数据库查询LIMIT 数据分页 SQL的语句LIMIT 约束SELECT 查询数据包表时,使得SQL查询语句返回指定的记录数(行数).LIMIT 可以设置1个或2个int整型常量数字作为参数.L ...

  8. 使用forkjoin框架分页查询所有数据的例子

    使用forkjoin框架分页查询所有数据的例子 import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor ...

  9. php计算是否有下一页,怎么进行分页数据的查询,如何判断是否有下一页?

    怎么进行分页数据的查询,如何判断是否有下一页? 1.背景介绍 在开发过程当中,接触比较多的有MySQL.SQLServer.Oracle这三种数据库,这三种数据库都有自己内部的方法可以进行分页查询,M ...

  10. 数据查询分页显示的优化方法

    现有方法: 开始时间 [@start_dt ]   结束时间 [@end_dt ] 其它条件 [      ] 查询数据总量:[XXXX] 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

最新文章

  1. linux cgi转发串口数据库,CGI连接数据库的方法
  2. HTML在计算机中指什么,计算机正在执行的指令存放在什么中
  3. java的知识点30——设计模式
  4. centos 桥接配置 设置网络代理 lnmp搭建
  5. 肝!Python 网络编程
  6. java实现多线程断点续传,上传下载 分享
  7. 炼数成金数据分析课程---16、机器学习中的分类算法(交叉内容,后面要重点看)...
  8. Linux上搭建Samba,实现windows与Linux文件数据同步
  9. ASP.NET模拟其他用户进行关机
  10. 与ceph的区别_Ceph分布式存储高性能设计
  11. 字节跳动社招面试记录,java异常处理关键字
  12. linux之我常用的20条命令( 之三)
  13. 顺情说好话,耿直讨人嫌
  14. 穷究链表(四)--链表实现前的思考
  15. JDBC实现增删改查功能
  16. datepicker不能选择是为什么_为什么婚车不能倒退 婚车不能走回头路吗
  17. 2017计算机办公自动化试题,2017年计算机考试办公自动化试题及答案
  18. Windows下hosts文件的作用
  19. 更换app开发者账号
  20. 针对跨页三线表,在Word2016及以上版本中设置表标题和表头在下一页重复以及解决表格跨页处没有下框线的问题

热门文章

  1. Codeforces Round #342 (Div. 2) D. Finals in arithmetic(想法题/构造题)
  2. 为什么所有浏览器的userAgent都带Mozilla
  3. 20多行 Python 代码优雅搞定 PDF 转换成图片
  4. 我关注的那些程序员大佬
  5. 【量化】CSFB阿尔法多因子模型研究
  6. 51单片机数控电源c语言设计,单片机数控电源设计,含源代码,原理图
  7. 企业组织形态及财务报表
  8. 5.性能测试工具比较:Jmeter和LR
  9. 3.1 scrapy框架 -- 安装与基本使用
  10. 第一次冲刺-站立会议02