首页 > 代码库 > ThinkPHP 分页功能梳理

ThinkPHP 分页功能梳理

      最近在开发一个项目,使用了国内流行的ThinkPHP框架,我之前没怎么用过这个框架,也是临时抱佛脚,用的不怎么样?可能理解不是很深刻,如果有说的不对或不正确的地方,请大家多包涵,多指教。

ThinkPHP简介

      首先,说说怎么学习这个框架,当然是上官网,看官方的文档。地址如下:http://thinkphp.cn,可以下载开发包和开发手册。

      第二,说说这个框架的优点,这个框架能流行起来,一定有很多优点。我仅根据我的感受说三点:1)注释完全中文化,我喜欢(因为俺E文不好);2)框架的功能实现比较简洁,相比其它的框架,学习成本较低;3)广泛使用cacha,大大提升了网站的运行速度。

分页思考

      说了这么题外话,还没有说到今天的主题知识---分页。接下来,就详细梳理一下,ThinkPHP分页流程。

      首先问两个小白问题:

     1)为什么要分页?

  分页确实有效,但它一定会加大系统的复杂度,但可否不分页呢? 如果数据量少的话当然可以.但是对于企业信息系统来说数据量不会限制在一个小范围内.如果不顾一切的Select * from某个表,再将返回的数据一古脑的扔给客户,即使客户能够忍受成千上万足够让人眼花缭乱的表格式数据,繁忙的网络,紧张的服务器也会提出它们无声的抗议,甚至有时会以彻底的罢工作为终结.

     2)在哪里进行分页比较合适?

     要回答这个问题,就要了解我们的系统架构,现在的B/S系统一般都是三层架构,如下图所示。

     技术分享

     也就是说,分页可以在浏览器,web服务器和数据库三个地方实现。究竟哪个地方好呢?为什么?(这个问题留给大家思考)

分页实现

     上面说的都是原理,下面说说技术实现。thinkphp的分页处理放在数据库这一层上面,是非常合理的做法。下面分页的实例基于ThinkPHP3.2.3实现。

     首先,我们要创建需要分页的数据。建表如下:

     CREATE TABLE `my_usertest` (
             `id` int(11) NOT NULL,
             `account` varchar(32) NOT NULL,
             `pwd` varchar(64) NOT NULL,
             PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

     自己可以根据需要插入多条数据。

     第二步, 创建分页对象函数,获取thinkPHP自带的分页组件。     

/** * TODO 基础分页的相同代码封装,使前台的代码更少 * @param $count 要分页的总记录数 * @param int $pagesize 每页查询条数 * @return \Think\Page */function getpage($count, $pagesize = 10) {    $p = new Think\Page($count, $pagesize);    $p->setConfig(‘header‘, ‘<li class="rows">共<b>%TOTAL_ROW%</b>条记录&nbsp;第<b>%NOW_PAGE%</b>页/共<b>%TOTAL_PAGE%</b>页</li>‘);    $p->setConfig(‘prev‘, ‘上一页‘);    $p->setConfig(‘next‘, ‘下一页‘);    $p->setConfig(‘last‘, ‘末页‘);    $p->setConfig(‘first‘, ‘首页‘);    $p->setConfig(‘theme‘, ‘%FIRST%%UP_PAGE%%LINK_PAGE%%DOWN_PAGE%%END%%HEADER%‘);    $p->lastSuffix = false;//最后一页不显示为总页数    return $p;}

      第三步,在控制器侧,进行调用分页对象。

public function showAllUsers() {        $m = M(‘usertest‘);              $where = "id>10";        $count = $m->where($where)->count();        $p = getpage($count,3);        $list = $m->field(true)->where($where)->order(‘id‘)->limit($p->firstRow, $p->listRows)->select();        $this->assign(‘select‘, $list); // 赋值数据集        $this->assign(‘page‘, $p->show()); // 赋值分页输出        $this->display();    }

     第四步,页面数据展示处理。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">    <head>        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />        <title>分页实例</title>                <style>        .pages a,.pages span {            display:inline-block;            padding:2px 5px;            margin:0 1px;            border:1px solid #f0f0f0;            -webkit-border-radius:3px;            -moz-border-radius:3px;            border-radius:3px;        }        .pages a,.pages li {            display:inline-block;            list-style: none;            text-decoration:none; color:#58A0D3;        }        .pages a.first,.pages a.prev,.pages a.next,.pages a.end{            margin:0;        }        .pages a:hover{            border-color:#50A8E6;        }        .pages span.current{            background:#50A8E6;            color:#FFF;            font-weight:700;            border-color:#50A8E6;        }        </style>    </head>    <body>        <table width="80%" border="1" cellpadding="1" cellspacing="1" bgcolor="#99CC33" bordercolor="#FFFFFF">            <tr>                <td colspan="3" bgcolor="#FFFFFF" class="title" align="center">用户表分页</td>            </tr>            <tr class="title">                <td bgcolor="#FFFFFF" width="44">ID</td>                <td bgcolor="#FFFFFF" width="120">账号</td>                <td bgcolor="#FFFFFF" width="223">密码</td>            </tr>            <foreach name=‘select‘ item=‘user‘ >                <tr class="content">                    <td bgcolor="#FFFFFF">&nbsp;{$user.id}</td>                    <td bgcolor="#FFFFFF">&nbsp;{$user.account}</td>                    <td bgcolor="#FFFFFF">&nbsp;{$user.pwd}</td>                </tr>            </foreach>            <tr class="content">                <td colspan="3" bgcolor="#FFFFFF"><div class="pages">                    {$page}                </div></td>              </tr>        </table>    </body></html>

       最后效果如下图所示:

       技术分享

      

      

ThinkPHP 分页功能梳理