php分页思路以及在ZF中的使用


Posted in PHP onMay 30, 2012

只需要得到两个变量就成功了一半:
每页要显示的记录数$pageSize
表中总的数据量 $rowCount
有了以上两个变量,我们就可以得出 共有几页了$pageCount
然后通过for循环,比如总共有13个页面,那么很容易就能通过for循环输出页数

$nav='';//用来保存页数的一个变量 
for ($i=1;$i<=13;$i++) 
{ 
$nav.="<a href='index.php?page=".$i."'>第".$i."页</a> "; 
}

以上的for循环将输出如
第1页,第2页,第3页,第4页,第5页,第6页,第7页,第8页,第9页,第10页,第11页,第12页,第13页
如果我们只想每次只显示十个页面呢?比如1-10页,11-20页
很简单,只要稍微修改下for循环即可实现
$step= floor(($pageNow-1)/10)*10+1; 
for ($i=$step;$i<=$step+10;$i++) 
{ 
$nav.="<a href='index.php?page=".$i."'>第".$i."页</a> "; 
}

比如,当前页面$pageNow如何在1~10之间的话,那么$step=0
当前页面$pageNow如何在11~20之间的话,那么$step=10
当前页面$pageNow如何在21~30之间的话,那么$step=20
参考具体的实现过程的代码,我们不难发现,for循环的第二个条件只需要加上10就可以实现每次只显示10也的情况了,我们将这一步分装在fenyePage类中的getLink()方法中
话又说回来,如何才能得到$pageSize和$rowCount两个变量的值呢?
$pageSize可以又程序员自己指定,$rowCount可以借助一个简单的执行sql语句的函数就能得到
<?php 
/** 
* $sql语句:①获取数据②获取总记录数 
*/ 
class fenyePage{ 
public $pageSize=5;//每页显示的数量-->程序员指定的 
public $rowCount;//这是从数据库中获取的(形如SELECT COUNT(id) FROM TABLE)用来保存总共有多少条记录 
public $pageNow;//通过$_GET['page']获取的,用来保存当前所在的页码 
public $pageCount;//计算得到的,用来保存总共有多少页 
public $res_arr;//用来保存要显示到页面的数据(比如保存SELECT * FROM TABLE LIMIT 0,10 检索的数据) 
public $nav;//显示第几页第几页的导航条 
/** 
* 取得当前页面的超链接 
* 
* @author 小飞 2012/5/30 
*/ 
public function getLink() 
{ 
$this->nav=''; 
$this->pageCount=ceil(($this->rowCount/$this->pageSize)); 
$step= floor(($this->pageNow-1)/10)*10+1; 
if ($this->pageNow>10) 
{ 
$this->nav.=" <a href='index.php?page=".($step-1)."'> << </a> ";//整体每10页向前翻 
} 
if ($this->pageNow!=1) 
{ 
$this->nav.="<a href='index.php?page=".($this->pageNow-1)."'> 上一页</a> "; 
} 
if ($this->pageNow!=1) 
{ 
$this->nav.="<a href='index.php?page=1'>首页</a> "; 
} 
for ($start=$step;$start<$step+10 && $start<=$this->pageCount;$start++) 
{ 
$this->nav.="<a href='index.php?page=".$start."'>".$start."</a> "; 
} 
if ($this->pageNow!=$this->pageCount) 
{ 
$this->nav.="<a href='index.php?page=".$this->pageCount."'>末页</a> "; 
} 
if ($this->pageNow!=$this->pageCount) 
{ 
$this->nav.=" <a href='index.php?page=".($this->pageNow+1)."'>下一页</a>"; 
} 
if ($this->pageCount>10 && $this->pageNow<$this->pageCount-8){ 
$this->nav.=" <a href='index.php?page=".($step+10)."'> >> </a>";//整体每10页向后翻 
} 
$this->nav.="/共有".$this->pageCount."页"; 
} 
} 
?>

由于zf中操作数据库的任务由model层来完成,所以,我将获取$rowCount的值的函数放在了对应的表model中
比如:我是操作order表的
那么当我要显示所有订单信息的时候,我通过order类中的showorder()方法取得$rowCount的值,并将其付给分页类中的$rowCount属性
同样,将要显示在页面上的数据信息也一并付给了分页类中的$res_arr属性
这样,我们就可以很容易的通过实例化一个分页类(fenyePage),然后将其通过参数传给showorder()函数,由该函数完成以下动作:
①要显示在页面上的信息
②表中总共有多少条记录
/** 
* 根据指定的用户id,查询该用户的历史订餐记录 
* 
* @author 小飞 2012/5/30 
* @param $id 用户id 
* @param $fenye 实例化的一个对象,用来处理分页 
* @todo $sql1语句 "select * from table where * limit 0,10" 该sql语句主要用来检索数据库中的数据,用以显示在view层 
* @todo $sql2语句 "select count(id) from table" 该sql语句用来得出总的数据量 
*/ 
public function showorder($id=null,$fenye=null) 
{ 
$db = $this->getAdapter(); 
$select=$db->select(); 
$select->from(array('o' => 'order'),array('o.id','o.user_id','o.user_name','o.food_name','o.food_price','o.order_time','o.order_state')); 
if ($id!=null){ 
$select->where('o.user_id=?',$id); 
} 
$select->join(array('d'=>'department'),'o.dep_id = d.id','d.dep_name'); 
if($fenye!=null){ 
$select->limit($fenye->pageSize,($fenye->pageNow-1)*$fenye->pageSize); 
} 
$sql1=$select->__toString(); 
//该sql语句主要用来计算总的数据量 
$sql2="SELECT COUNT(id) FROM `order`"; 
$fenye->res_arr=$db->fetchAll($sql1);//将要显示的数据存储到分页类的$res_arr属性当中,方便调用 
$rowCount=$db->fetchAll($sql2);//将表中的总数据量保存到分页类的rowCount属性当中 
$fenye->rowCount=$rowCount[0]['COUNT(id)']; 
$fenye->getLink(); 
return $fenye->res_arr; 
}

至此,分页类的功能就已经实现了
原创文章:WEB开发_小飞
PHP 相关文章推荐
PHP 数组入门教程小结
May 20 PHP
php 中的4种标记风格介绍
May 10 PHP
php跨域cookie共享使用方法
Feb 20 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
Oct 17 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
微信 getAccessToken方法详解及实例
Nov 23 PHP
PHPMailer发送邮件
Dec 28 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
php 将json格式数据转换成数组的方法
Aug 21 PHP
PHP数组与字符串互相转换实例
May 05 PHP
PHP7 整型处理机制修改
Mar 09 PHP
php DOS攻击实现代码(附如何防范)
May 29 #PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 #PHP
PHP中将网页导出为Word文档的代码
May 25 #PHP
php在文件指定行中写入代码的方法
May 23 #PHP
php替换超长文本中的特殊字符的函数代码
May 22 #PHP
php提示undefined index的几种解决方法
May 21 #PHP
openflashchart 2.0 简单案例php版
May 21 #PHP
You might like
PHP脚本的10个技巧(5)
2006/10/09 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
js 表格隔行颜色
2009/12/02 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
Python的Tornado框架异步编程入门实例
2015/04/24 Python
Python的Django框架中的数据过滤功能
2015/07/17 Python
python 全局变量的import机制介绍
2017/09/07 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
python读写配置文件操作示例
2019/07/03 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
Python类成员继承重写的实现
2020/09/16 Python
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
业务部主管岗位职责
2014/01/29 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang