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>

最后效果如下图所示:

时间: 2024-12-13 06:13:53

ThinkPHP 分页功能梳理的相关文章

laravel分页功能

laravel的分页功能类似thinkphp的分页功能,封装了一个非常简便的方法 paginate()和simplePaginate(),括号里面填数字,是每一页要输出的数据条数 区别在于paginate()显示上一页,下一个,和对应第几页的数字,而simplePaginate()只执行了上一页,下一页的翻页功能,没有对应的数字页码数 paginate()方法 控制器里的代码 $res = Test::paginate(3); return view('lara', ['res' => $res

Yii2.0实用功能技巧解密之——分页功能

Yii中的分页功能主要由yii\web: Linkable接口.yii\widgets: LinkPager类和yii\data: Pagination类三个组成. yii\data: Pagination 主要功能是对分页中的参数进行设置,如当前页.每页大小.总页数,总记录数等. yii\widgets: LinkPager 主要是根据yii\data: Pagination类所提供的参数生成前台页面的分页html代码. 使用:先在action里面生成分页对象,然后在前台的LinkPager中

网页分页功能的实现

最近在学习JavaWeb的时候,用到了分页功能,现在进行一个记录,以备不时之需 第一步:先完成分页Bean的编写. 就是对当前页数,每页显示的记录数,总记录数,总页数,分页显示的信息进行封装.作为通用的分页功能的实现,这里用到了泛型 import java.util.List; /** * 分页封装 * */ public class PageBean<T> { private int currPage;//当前页数 private int pageSize;//每页显示记录数 private

网站前端_JavaScript-项目经验.纯JavaScript实现客户端的分页功能?

项目简介: 说明: 此项目属于医院电子病例系统,由于历史原因,整个系统后台基于Java开发,前端使用Html+CSS+原生JavaScript,项目功能模块要求必须纯JS实现,而此次的任务是为住院病例页面编写一个客户端分页功能. 实现思路: 1. 基于客户端分页的前提是数据已经加载完毕,所以此功能模块必须等待数据加载完毕后再加载 2. 基于客户端分页的首页只需要显示24个患者信息即可 3. 上一页/当前页/下一页功能类似,基于当前页面传递同样的参数(页码, 限制患者数),所以自然而然想到了递归,

UIScrollView代理 和分页功能

#import "ViewController.h" @interface ViewController () <UIScrollViewDelegate> @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; @property (weak, nonatomic) IBOutlet UIPageControl *pageControl; /** 定时器 */ @property (nonatomic,

MVC5+EF6 (附加分页功能)

我们对之前的Views à Account à Index.cshtml 进行修改以完成今天的示例. 界面样式修改前: 下面对Views à Account à Index.cshtml进行如下修改: 应用布局页 _LayoutAdmin.cshtml 2. 将HTML部分body之外的全部删掉,只留下正文内容,运行这个页面. 对样式做一些小调整,最终变成如下样式. (调整样式的步骤略,大家可以直接查看源码) 通过Create New 新建两条测试数据,为后面分页做准备,后面每3条分一页. 目前

url参数的分解与组合 &amp;&amp; 分页功能

url参数的分解与组合: 需求来源:分页功能中需要动态更改page参数. 实现:2个重要函数 1. 分解 1 parse_str(str, [array]); 2 3 /* 4 str: url字符串, array: 结果 5 例: 6 str : "id=1&page=2" 7 得array: 8 array["id"] = 1, array["page"] = 2 2. 组合 1 $str = http_build_query($ar

Ecmall系统自带的分页功能

在Ecmall的二次开发中,分页是必不可少的.这个系统已经自带了分页功能,下面来看看如何使用这个分页. 下面是一个自定义的类,用于查看订单的详细情况.关键在于get_order_data()这个方法,分页的使用也在这个方法的内部了.应该有的注释都有了,应该会比较容易懂,我不就多说了. <?php define('NUM_PER_PAGE', 15); // 每页显示数量 class NowaMagicApp extends MallbaseApp { public function index(

PL/SQL编程—分页功能(存储过程)

SQL> create table t_book(bookid varchar2(3),bookname varchar2(50),publish varchar2(50)); Table created SQL> SQL> create or replace procedure sp_add_book(bookid in varchar2, bookname in varchar2,publish in varchar2) is 2 begin 3 insert into t_book