<?php
$page = new Page(2, 40);
var_dump($page->allUrl());
class Page
{
//每页显示多少条数据
protected $number;
//一共有多少条数据
protected $totalCount;
//当前页
protected $page;
//总页数
protected $totalPage;
//url
protected $url; public function __construct($number, $totalCount)
{
$this->number = $number;
$this->totalCount = $totalCount;
//得到总页数
$this->totalPage = $this->getTotalPage();
//得到当前页数
$this->page = $this->getPage();
//得到url
$this->url = $this->getUrl();
} /**
* 获取总页数
*
* @return void
*/
protected function getTotalPage()
{
return ceil($this->totalCount / $this->number);
} /**
* 获取当前页码
*
* @return void
*/
protected function getPage()
{
if (empty($_GET['page'])) {
$page = 1;
} elseif ($_GET['page'] > $this->totalPage) {
$page = $this->totalPage;
} elseif ($_GET['page'] < 1) {
$page = 1;
} else {
$page = $_GET['page'];
}
return $page;
} /**
* 获取去掉page之后的url
*
* @return void
*/
protected function getUrl()
{
//得到协议名
$scheme = $_SERVER['REQUEST_SCHEME'];
//得到主机名
$host = $_SERVER['SERVER_NAME'];
//得到端口号
$port = $_SERVER['SERVER_PORT'];
//得到路径和请求字符串
$uri = $_SERVER['REQUEST_URI'];
//中间做处理,要将page=5等这种字符串拼接url中,所以如果原来url中有page这个参数,我们首先需要先将原来的page参数给清空
$uriArray = parse_url($uri);
$path = $uriArray['path'];
if (!empty($uriArray['query'])) {
//首先将请求字符串变为关联数组
parse_str($uriArray['query'], $array);
//清除掉关联数组中的page键值对
unset($array['page']);
//将剩下的参数拼接为请求字符串
$query = http_build_query($array);
//再将请求字符串拼接到路径的后面
if ($query != '') {
$path = $path . '?' . $query;
}
}
return $scheme . '://' . $host . ':' . $port . $path;
} /**
* 设置url
*
* @param [type] $str
* @return void
*/
protected function setUrl($str)
{
if (strstr($this->url, '?')) {
$url = $this->url . '&' . $str;
} else {
$url = $this->url . '?' . $str;
}
return $url;
} /**
* 返回所有url
*
* @return void
*/
public function allUrl()
{
return [
'first' => $this->first(),
'prev' => $this->prev(),
'next' => $this->next(),
'end' => $this->end()
];
} /**
* 首页
*
* @return void
*/
public function first()
{
return $this->setUrl('page=1');
} /**
* 下一页
*
* @return void
*/
public function next()
{
//根据当前page得到下一页的页码
if ($this->page + 1 > $this->totalPage) {
$page = $this->totalPage;
} else {
$page = $this->page + 1;
}
return $this->setUrl('page=' . $page);
} /**
* 上一页
*
* @return void
*/
public function prev()
{
if ($this->page - 1 < 1) {
$page = 1;
} else {
$page = $this->page - 1;
}
return $this->setUrl('page=' . $page);
} /**
* 尾页
*
* @return void
*/
public function end()
{
return $this->setUrl('page=' . $this->totalPage);
} /**
* 偏移量,方便数据库查找
*
* @return void
*/
public function limit()
{
$offset = ($this->page - 1) * $this->number;
return $offset . ',' . $this->number;
}
}

运行结果:

PHP学习之分页类的更多相关文章

  1. php大力力 [019节]php分页类的学习

    2015-08-26 php大力力019.php分页类的学习 [2014]兄弟连高洛峰 PHP教程14.2.1 分页需求分析 14:18 [2014]兄弟连高洛峰 PHP教程14.2.2 分页类中分页 ...

  2. php分页类学习

    分页是目前在显示大量结果时所采用的最好的方式.有了下面这些代码的帮助,开发人员可以在多个页面中显示大量的数据.在互联网上,分​页是一般用于搜索结果或是浏览全部信息(比如:一个论坛主题).几乎在每一个W ...

  3. Yii2中自带分页类实现分页

    1.首先写控制器层 先引用pagination类 use yii\data\Pagination; 写自己的方法: function actionFenye(){        $data = Fie ...

  4. php 自己写的好看的分页类

    自己写的一个分页类 ,不是很完整,个别没有做验证,但可以使用,分页效果见文章底部.除了链接数据库的代码没有粘贴上来,其他的都粘贴了.供学习使用- <?php /** * Created by P ...

  5. 自定义MVC框架之工具类-分页类的封装

    以前写过一个MVC框架,封装的有点low,经过一段时间的沉淀,打算重新改造下,之前这篇文章封装过一个验证码类. 这次重新改造MVC有几个很大的收获 >全部代码都是用Ubuntu+Vim编写,以前 ...

  6. python---django中自带分页类使用

    请先看在学习tornado时,写的自定义分页类:思路一致: python---自定义分页类 1.基础使用: 后台数据获取: from django.core.paginator import Pagi ...

  7. php实现的分页类

    php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...

  8. asp.net的快捷实用分页类

    KeleyiPager分页类,可以于对列表页进行分页浏览,代码是从HoverTreeCMS项目中COPY的,感觉很不错,使用简单方便,但是功能强大. 在线体验效果:http://cms.hovertr ...

  9. php分页类

    1.需求 学会php分页类的使用 2.参考例子 CI的分页类 3.代码部分 <?php class pagination{ public $pagesize=20; public $pagein ...

随机推荐

  1. 二零一八阿里p7笔试116题

    1. junit用法,before,beforeClass,after, afterClass的执行顺序 2. 分布式锁 3. nginx的请求转发算法,如何配置根据权重转发 4. 用hashmap实 ...

  2. mount命令解析

    可以参考两位大神的理解 Linux mount 命令 Linux的mount命令详解

  3. 安装mysql 好不容易成功了 却连不上

    [mysqld] skip-grant-tables datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbo ...

  4. C#自由组合本地缓存、分布式缓存和数据库的数据

    一.背景介绍: 我们在进行数据存储的时候,有时候会加入本地缓存.分布式缓存以及数据库存储三级的结构,当我们取值的时候经常是像下面这样的流程: 1.先取本地缓存,如果值存在直接返回 2.本地缓存不存在, ...

  5. test11111111

    test 博文内容中字符过多,拒绝显示 123123123

  6. jmeter接口测试-使用aes加密算法

    好久没写文章了,一直在忙公司项目的事情!今天抽空写篇关于jmeter加密的教程吧! 随着互联网的发展,越来越多的系统开始提供接口调用! 我们进行接口测试的时候,大多数接口或多或少的都使用了各种加密验证 ...

  7. 使用math中的hypot实现向量

    from math import hypot class Vector: def __init__(self,x=0,y=0): self.x = x self.y = y def __repr__( ...

  8. [2019HDU多校第五场][HDU 6626][C. geometric problem]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6626 题目大意:给出平面上六个点\(A,B,M,N,X,Y\)以及两条直线\(L1,L2\),要求在四 ...

  9. EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配

    EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 问题原因: 两个表A\B之间存在外键关系,当插入表A的时候,A的外键B在B表中不存在可以引起这个问题: ...

  10. keyup([[data],fn]) 当按钮被松开时,发生 keyup 事件。它发生在当前获得焦点的元素上。

    keyup([[data],fn]) 概述 当按钮被松开时,发生 keyup 事件.它发生在当前获得焦点的元素上. 注释:如果在文档元素上进行设置,则无论元素是否获得焦点,该事件都会发生.直线电机选型 ...