一. 思路整理

实现一个数据分页功能,需要有数据的总条数,每页展示的条数,和当前在第几页这三个参数

通过⌈总条数/每页展示的条数⌉可以得到总页数,比如某留言板有101条留言,每页展示10条,一那就需要11个页面进行展示

数据分页核心就是通过SQL的limit函数来控制当前页显示第几条到第几条,比如第一页limit(0,10),就是第1条到第10条,第二页是limit(11,10),就是第11条到第20条 . . . . . .

用当(前页数-1)*每页显示条数+1就可以得到limit的第一个参数,limit的第二个参数就是当前页显示的数据条数.

二. 3个必要参数

当前页$page使用get方式在url中传入,修改page属性就可以跳转页面,点击上一页下一页等操作都是通过修改page实现的

每页展示条数$listRow在实例化page类时传参的方式定义,通过修改l$istrow就可以设置每页显示的信息条数:

显示的总条数$total通过查询数据库获得:

创建一个数据表messageboard,为了方便只设置id title两个字段

创建数据库连接

$pdoObj = new PDO("mysql:host=localhost;dbname=zhangkwebsite", 'root', 'root');
$pdoObj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

获取数据的总条数$ncount

$query=$pdoObj->query("select count(*) from messageboard");
$val=$query->fetch(PDO::FETCH_ASSOC);
$ncount=$val['count(*)'];

三. 数据分页类

创建一个数据分页类page,在类中定义好需要使用的变量

class page{
private $total;//总记录数
private $listRows;//每页显示行数
private $limit;//sql语句的limit限制
private $uri;//去掉page属性的uri
private $pageNum;//总页数
private $listNum;//页码数量

总记录数每页显示的条数在用户实例化类时设置

public function __construct($total,$listRows=10){
$this->total=$total;
$this->listRows=$listRows;

当前页显示的记录$limit

limit (前页数-1)*每页显示条数+1,每页总条数  和前面的例子完全相同 

    private function setLimit()
{
return 'Limit' .' '.($this->page - 1) * $this->listRows .','."{$this->listRows}";
}

setLimit()的返回值将保存在私有变量$limit中,使用__get函数为用户提供一个调用的接口

function __get($args)
{
if ($args=="limit"){
return $this->limit;
}
else
return null;
}

这个字符串在用户查询时拼接在sql语句中


$p=new page($ncount,5);
$query=$pdoObj->query("select * from messageboard {$p->limit}");

获取当前页的第一条和最后一条,这个没什么难度

private function start(){
if($this->total==0)
return 0;
else
return ($this->page - 1) * $this->listRows+1;
}
private function end(){
return min($this->total,$this->page*$this->listRows);
}

pagegetUri()方法:去掉链接中的page属性

因为$page在url中,不能直接改变它的值,需要通过字符串的方式,先将他的值去掉,然后再拼接上:

//将uri的page去掉
private function getUri(){
//第一步.获取当前页面的url,检查是否由如果没有问号,加上问号
$uri=$_SERVER['REQUEST_URI'].(strpos($_SERVER['REQUEST_URI'],'?')?'':'?');
//parse_url将当前url转换成数组格式
$parse=parse_url($uri);
//第二步.去掉url里的page属性,然后重新拼接起来
if(isset($parse['query'])){
parse_str($parse['query'],$params);
unset($params['page']);
}
$url=$parse['path'].'?'.http_build_query($params);
//parse_url:将url转成有path和query两个属性的数组
//parse_str("page=10",$param)将字符串解析成多个变量存入数组$param中
//http_build_query将数组类型转为字符串类型
return $uri;
}

函数的返回值将赋给$uri变量

点击跳转的功能

用字符串拼接出一个链接,打印在屏幕上,需要注意的是链接的地址:

这个时候$uri就有用了,首页链接的地址就是$uri + '&page=1'

//首页
private function first(){
if ($this->page==1)
return '';
else
return "<a href='{$this->uri}&page=1'>首页</a>&nbsp;&nbsp;";
}

尾页,链接的地址就是$uri + '&page=页数'

<a href='{$this->uri}&page=$lastpage'>尾页</a>

上一页下一页的链接就是当前的page+1,当前的page-1,与首页末页的区别就是要做一下判断,如果当前是第一页就不能点击上一页,当前是最后一页就不能点击下一页

为了体现良好模块化,链接的文字内容应该封装在一个字符串中:

private $config=array("header"=>"新闻","unit"=>"条","prev"=>"上一页","next"=>"下一页","first"=>"首页","last"=>"尾页");

代码就是这样:

//上一页
private function prev()
{
if ($this->page == 1)
return "{$this->config['prev']}";
else {
$prevpage=$this->page-1;
return "<a href='{$this->uri}&page=$prevpage'>{$this->config['prev']}</a>&nbsp;&nbsp;";
}
}

页码设置

三个字符串,前一个是循环输出页码数量的一半向下取整,中间是当前页不加链接,后一个循环输出是当前页之后的一半向下取整

//设置页码:
//第一个循环,显示总数向下取整floor(5)=2次,显示当前页-2,当前页-1
//第二个循环,显示总数向下取整floor(5)=2次,当前页+1,当前页+2
private function partList(){
$linkpage='';
$inum=floor($this->listNum/2);
for($i=$inum;$i>=1;$i--){
$page=$this->page-$i;
if($page>=1){
$linkpage.="<a href='{$this->uri}&page={$page}'>{$page}</a>&emsp;";
}
}
$linkpage.="{$this->page}&emsp;";
for($i=1;$i<=$inum;$i++){
$listpage=$this->page+$i;
if ($listpage<=$this->pageNum){
$linkpage.="<a href='{$this->uri}&page={$listpage}'>{$listpage}</a>&emsp;";
}
}
return $linkpage;
}

跳转到第X页功能

这个要借助js实现:

点击跳转按钮时,触发事件函数:

  获取input框中的内容,将其作为$page的值拼接到uri上

  然后通过location方法跳转到拼接好的uri对应的页面

private function gopage(){
$go="到第<input type='text' class='goinput' style='width:28px;'>页&nbsp;
<button class='goBn'>跳转</button>";
$go.="<script>
var goBn = document.querySelector('.goBn');
goBn.onclick=function(){
var go = document.querySelector('.goinput').value;
if(go<{$this->pageNum}&&go>0){
var gohref = new String(\"{$this->uri}&page=\");
var gohref=gohref+go;
location=gohref;
}
}
</script>";
return $go;
}

四.完整的代码如下:

分页类page.php

<?php
class page{
private $total;//总记录数
private $listRows;//每页显示行数
private $uri;//uri
private $page;//当前页
private $limit;//sql语句的limit限制
private $pageNum;//总页数
private $listNum=5;//页码数
private $config=array("header"=>"新闻","unit"=>"条","prev"=>"上一页","next"=>"下一页","first"=>"首页","last"=>"尾页");
public function __construct($total,$listRows=10){
$this->total=$total;
$this->listRows=$listRows;
$this->uri=$this->getUri();
$this->page=empty($_GET['page'])?1:$_GET['page'];
//获取页数:总数除以每页uri记录数向上取整
$this->pageNum=ceil($this->total/$this->listRows);
$this->limit=$this->setLimit();
}
function __get($args)
{
if ($args=="limit"){
return $this->limit;
}
else
return null;
}
//将uri的page去掉
private function getUri(){
//获取当前页面的url,检查是否有问号,如果没有问号,加上问号
$uri=$_SERVER['REQUEST_URI'].(strpos($_SERVER['REQUEST_URI'],'?')?'':'?');
//parse_url将url转换成数组格式
$parse=parse_url($uri);
//去掉url里的page属性,然后重新拼接起来
if(isset($parse['query'])){
parse_str($parse['query'],$params);
unset($params['page']);
}
$url=$parse['path'].'?'.http_build_query($params);
//parse_url:将url转成有path和query两个属性的数组
//parse_str("page=10",$param)将字符串解析成多个变量存入数组$param中
//http_build_query将数组类型转为字符串类型
return $url;
}
//当前页从第几个开始显示,显示多少个
private function setLimit()
{
return 'Limit' .' '.($this->page - 1) * $this->listRows .','."{$this->listRows}";
}
//获取当前页的第一条和最后一条显示的行号
private function start(){
if($this->total==0)
return 0;
else
return ($this->page - 1) * $this->listRows+1;
}
private function end(){
return min($this->total,$this->page*$this->listRows);
}
//首页
private function first(){
if ($this->page==1)
return '';
else
return "<a href='{$this->uri}&page=1'>{$this->config['first']}</a>&nbsp;&nbsp;";
}
//上一页
private function prev()
{
if ($this->page == 1)
return "{$this->config['prev']}";
else {
$prevpage=$this->page-1;
return "<a href='{$this->uri}&page=$prevpage'>{$this->config['prev']}</a>&nbsp;&nbsp;";
}
}
//下一页
private function next()
{
if ($this->page == $this->pageNum)
return "{$this->config['next']}";
else {
$nextpage=$this->page+1;
return "<a href='{$this->uri}&page=$nextpage'>{$this->config['next']}</a>&nbsp;&nbsp;";
}
}
//尾页
private function last()
{
if ($this->page == $this->pageNum)
return '';
else {
$lastpage=$this->pageNum;
return "<a href='{$this->uri}&page=$lastpage'>{$this->config['last']}</a>&nbsp;&nbsp;";
}
}
//设置页码:
//写两个循环,前一个是当前页之前的一半,中间是当前页不加链接,后一个是当前页之后的一半
//第一个循环,显示总数向下取整floor(5)=2次,显示当前页-2,当前页-1
//第二个循环,显示总数向下取整floor(5)=2次,当前页+1,当前页+2
private function partList(){
$linkpage='';
$inum=floor($this->listNum/2);
for($i=$inum;$i>=1;$i--){
$page=$this->page-$i;
if($page>=1){
$linkpage.="<a href='{$this->uri}&page={$page}'>{$page}</a>&emsp;";
}
}
$linkpage.="{$this->page}&emsp;";
for($i=1;$i<=$inum;$i++){
$listpage=$this->page+$i;
if ($listpage<=$this->pageNum){
$linkpage.="<a href='{$this->uri}&page={$listpage}'>{$listpage}</a>&emsp;";
}
}
return $linkpage;
}
private function gopage(){
$go="到第<input type='text' class='goinput' style='width:28px;'>页&nbsp;
<button class='goBn'>跳转</button>";
$go.="<script>
var goBn = document.querySelector('.goBn');
goBn.onclick=function(){
var go = document.querySelector('.goinput').value;
if(go<{$this->pageNum}&&go>0){
var gohref = new String(\"{$this->uri}&page=\");
var gohref=gohref+go;
location=gohref;
}
}
</script>";
return $go;
}
//显示的当前页面内容
function fpage($checkHtml=array(1,2,3,4,5,6,7,8,9,10)){
$html[1]="共有{$this->total}{$this->config['unit']}{$this->config['header']}&emsp;";
$html[2]="本页{$this->start()}条到{$this->end()}条&emsp;";
$html[3]="当前为{$this->page}/{$this->pageNum}页&emsp;";
$html[4]="{$this->first()}";
$html[5]="{$this->prev()}";
$html[6]="{$this->next()}";
$html[7]="{$this->last()}&emsp;";
$html[8]="{$this->partList()}&emsp;";
$html[9]="{$this->gopage()}";
$html[10]="&emsp;";
$showhtml='';
foreach($checkHtml as $i){
$showhtml.=$html[$i];
}
return $showhtml;
}
}

messageboard.php

<?php
header("Content-type: text/html; charset=utf-8");
include 'page.php';
try {
$pdoObj = new PDO("mysql:host=localhost;dbname=zhangkwebsite", 'root', 'root');
$pdoObj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $p){
echo '数据库连接失败'.$p->getMessage();
}
try{
echo '<table align="center" border="1" width="1000">'
."<tr><th colspan='2'>新闻浏览</th></tr>";
$query=$pdoObj->query("select count(*) from messageboard");
$val=$query->fetch(PDO::FETCH_ASSOC);
$ncount=$val['count(*)'];
$p=new page(100,5);
$query=$pdoObj->query("select * from messageboard {$p->limit}");
while($val=$query->fetch(PDO::FETCH_ASSOC)){
echo '<tr>';
echo '<td>'.$val["id"].'</td>';
echo '<td>'.$val["title"].'</td>';
echo '</tr>';
}
echo "<tr><td colspan='2' style='text-align: right'>{$p->fpage()}</td></tr></table>";
}
//query("select * from account where account=$XX and pwd=YY");
//query("select * from account where account=:account and pwd=:pwd",['account'=>$xx,'']);
//query("select * from account where account=? and pwd=?");
//sprintf(select * from account where account=%d and pwd=%s,[''])
catch(PDOException $e){
echo '错误'.$e->getMessage();
}

原生PHP实现Mysql数据分页功能的更多相关文章

  1. php分页例子实现读取mysql数据分页显示

    以下代码是PHP分页案例,测试通过,主要是PHP+mysql实现分页,代码来处百度空间,有兴趣看的话可以了解一下PHP是如何分页的? <?php $link = mysql_connect(&q ...

  2. PHP MySQL数据分页

    SQL SELECT语句查询总是可能导致数千条记录.但是在一个页面上显示所有结果并不是一个好主意.因此,我们可以根据要求将此结果划分为多个页面.分页意味着在多个页面中显示您的查询结果,而不是仅将它们全 ...

  3. MySQL的分页优化

    今天下午,帮同事重写了一个MySQL SQL语句,该SQL语句涉及两张表,其中一张表是字典表(需返回一个字段),另一张表是业务表(本身就有150个字段,需全部返回),当然,字段的个数是否合理在这里不予 ...

  4. salesforce 零基础开发入门学习(八)数据分页简单制作

    本篇介绍通过使用VF自带标签和Apex实现简单的数据翻页功能. 代码上来之前首先简单介绍一下本篇用到的主要知识: 1.ApexPages命名空间 此命名空间下的类用于VF的控制. 主要的类包括但不限于 ...

  5. Mybatis+MySQL动态分页查询

    https://blog.csdn.net/qq_34137397/article/details/63289621 mybatis有两种分页方法 1.内存分页,也就是假分页.本质是查出所有的数据然后 ...

  6. MyBatis 实现分页功能

    MySQL 的分页功能是基于内存的分页(即查出来所有记录,再按起始位置和页面容量取出结果). 案例:①根据用户名(支持模糊查询).用户角色 id 查询用户列表(即根据用户名称或根据用户角色 id 又或 ...

  7. 数据分页jdbc+mysql实现

    通过简单粗糙的功能不完善的客户管理案例体现jdbc+mysql的数据分页,与其说是管理系统,不如说就是一个jdbc数据分布的demo而已.但是话又说回来,麻雀虽小,五脏俱全.虽然是个小demo,但是其 ...

  8. 测试开发【提测平台】分享9-DBUntils优化数据连接&实现应用搜索和分页功能

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 从本期开始知识点讲以思维导图的形式给出,内容点会按照讲解-应用-展示的形式体现,这样会更清晰些. DBUntils连接池 在项目中链接数据 ...

  9. Oracle、MySql、SQLServer数据分页查询

    看过此博文后Oracle.MySql.SQLServer 数据分页查询,在根据公司的RegionRes表格做出了 SQLserver的分页查询语句: 别名.字段 FROM( SELECT row_nu ...

随机推荐

  1. 【php】php开发的前期准备

    原文来自:http://www.cnblogs.com/sows/p/6867675.html (博客园的)风马一族 侵犯版本,后果自负 php介绍 什么php? 一种服务器端的 HTML 脚本/编程 ...

  2. 连接池dbcp

    连接池dbcp DBCP:apache组织 使用步骤: 1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar.commons-logging-1.2 ...

  3. (译)Objective-C的动态特性

    这是一篇译文,原文在此,上一篇文章就是受这篇文章启发,这次干脆都翻译过来. 过去的几年中涌现了大量的Objective-C开发者.有些是从动态语言转过来的,比如Ruby或Python,有些是从强类型 ...

  4. Laravel 登录后清空COOKIE 方法

    需求 在Laravel 登陆立即清空保存的COOKIE数组 实现 # Http/Controllers/Auth/LoginController.php public function redirec ...

  5. SDUT_2502:火星计数法

    火星人的计数规则里只有a,b,c,d四个字母,计数规则从小到大是 a,b,c,d,aa,ab,ac,ad,ba,……. 给出来由a,b,c,d四种字母组成的火星数字,算出该数字是第几个(从1开始). ...

  6. shell学习(15)- eval及shell No such file or directory解决办法

    eval可以读取一连串的参数,然后按照参数特性来执行.参数数目不限,彼此之间用分号隔开. eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接 ...

  7. MyBatis动态SQL(一)

    MyBatis 的强大特性之一便是它的动态 SQL.动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似.在 MyBatis 之前的版本中,有很多元素需要花时间了解.MyBatis 3 ...

  8. 【NS2】在linux下安装低版本GGC

    1.下载安装包,cd到文件所在目录 sudo dpkg -i gcc41-compat-4.1.2-ubuntu1210_i386.deb g++41-compat-4.1.2_i386.deb 2. ...

  9. IDI Open 2016 H 字符串模拟题

    H - Palindrome Names 题意:给定一个字符串,每次可以向末尾添加一个字符或者更改一个字符.求使得字符串为回文串(从前往后和从后往前读一样)所花费的最小步数. 题解: 看来需要多思考啊 ...

  10. LightOJ 1370 Bi-shoe and Phi-shoe【欧拉函数 && 质数】

    题目链接: http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1370 题意: 给定值,求满足欧拉值大于等于这个 ...