php 实现分页功能(class封装了功能)

前言

分页是一个很常见的功能,我这里提供了分类类(class),用于前端页面中的四个按钮:

  1. 首页
  2. 下一页
  3. 上一页
  4. 尾页
    在这里插入图片描述
    上面的演示非常不直观,但足可以证明这个类可以完成分页功能。

完整的代码

附有非常详细的注释,但需要有一定的 php 基础。

<?php

/*
* //TODO 分页类(前端需传递两个参数)
* @请求方式: GET
* @num: 每页要显示多少条数据
* @sum: 一共有多少条数据
*/

class separatePage {

    protected $num;//每页显示多少条数据
    protected $sum;//总共有多少条数据
    protected $page;//当前页
    protected $totalPage;//总页数
    protected $url;//路径

    public function __construct($num, $sum){//!构造器
        $this -> num = $num;//每页显示多少条数据
        $this -> sum = $sum;//总共有多少条数据
        $this -> totalPage = $this -> getTotalPage();//得到总页数
        $this -> page = $this -> getPage();//得到当前页
        $this -> url = $this -> getUrl();//得到路径
    }

    //TODO 主功能核心函数(借助辅助函数返回完整URL)

    public function allUrl(){//!功能:所有URL(返回给前端用)
        return [
            '首页' => $this -> firstUrl(),//首页
            '下一页' => $this -> nextUrl(),//下一页
            '上一页' => $this -> prevUrl(),//上一页
            '尾页' => $this -> endUrl()//尾页
        ];
    }

    public function firstUrl(){//!功能:[首页]路径
        return $this -> setUrl('page=1');
    }

    public function nextUrl(){//!功能:[下一页]路径

        if($this -> page + 1 > $this -> totalPage){//如果当前页+1(下一页)后大于总页数
            $page = $this -> totalPage;//则直接跳转到尾页
        }

        else {//如果没超过总页数
            $page = $this -> page + 1;//则页码+1即可
        }
        
        return $this -> setUrl('page=' . $page);//返回
    }

    public function prevUrl(){//!功能:[上一页]路径

        if($this -> page - 1 < 1){//如果当前页-1(上一页)后小于1
            $page = 1;
        }

        else {//如果没小于1
            $page = $this -> page - 1;//则页码-1即可
        }

        return $this -> setUrl('page=' . $page);//返回

    }

    public function endUrl(){//!功能:[尾页]路径
        return $this -> setUrl('page=' . $this -> totalPage);
    }

    // TODO 辅助性工具函数(帮助主功能函数)

    protected function getTotalPage(){//!功能:获取总页数
        return ceil($this -> sum / $this -> num);//公式:总条数/每页显示数(向上取整)
    }

    protected function getPage(){//!功能:获取当前页

        if(empty($_GET['page'])){//判断前端参数有效值(传递参数是否为空)
            $page = 1;//如果为空则直接默认第一页
        }

        else if($_GET['page'] > $this -> totalPage){//判断前端参数有效值(是否大于总页数)
            $page = $this -> totalPage;//如果大于直接默认总页数
        }

        else if($_GET['page'] < 1){//判断前端参数有效值(是否小于1)
            $page = 1;//如果小于直接默认第一页
        }

        else{//前端传递的参数已合法(直接使用)
            $page = $_GET['page'];
        }

        return $page;//返回
    }

    protected function getUrl(){//!功能:获取路径(利用$_SERVER)
        
        $scheme = $_SERVER['REQUEST_SCHEME'];//协议名(http/https/ftp)
        $host = $_SERVER['SERVER_NAME'];//主机名(www.baidu.com/www.php.net)
        $port = $_SERVER['SERVER_PORT'];//端口号
        $uri = $_SERVER['REQUEST_URI'];//路径及请求参数

        $uriArray = parse_url($uri);//将路径及请求参数转换为关联数组
        $path = $uriArray['path'];//获取当前路径(/index.php)

        if(!empty($uriArray['query'])){//判断路径中是否存在请求参数(?name=a&age=15)
            parse_str($uriArray['query'], $array);//不为空则转为关联数组
            unset($array['page']);//清除请求参数中page参数(防止两个page参数出现)
            $query = http_build_query($array);//再拼接起来
        }

        if($query != ''){//为空则无需清除后拼接
            $path = $path . '?' . $query;//请求参数拼接
        }

        return $scheme . '://' . $host . ':' . $port . $path;//拼接完整的路径

    }

    protected function setUrl($e){//!功能:返回真实路径(给前端用)
        
        if(strstr($this -> url, '?')){//首先判断路径中有没有请求参数
            $url = $this -> url . '&' . $e;//拼接page参数
        }

        else{//没有请求参数
            $url = $this -> url . '?' . $e;//拼接page参数
        }

        return $url;//返回
    }

    //TODO 从数据库中取出数据给前端(使用SQL limit)

    public function limit(){//!功能:算出limit偏移
        $offset = ($this -> page - 1) * ($this -> num);//算出偏移
        return $offset . ',' . $this -> num;
    }

    public function data(){
    # 连接数据库...
        # 执行SQL语句: select * from list limit limit();
            # 做处理后连页码带数据返回给前端
    }
}

如何使用

第一步接收前端请求参数,第二步实例化类,第三步返回。

# 接收前端请求参数(2个)
	# num: 每页要显示多少条数据
	# sum: 一共有多少条数据
	
# 实例化类(5为num)
$test = new separatePage(5, 100);//这里填前端请求参数

# 返回URL与数据库中的记录
	# $test -> allUrl();
	# $test -> data();
发布了293 篇原创文章 · 获赞 502 · 访问量 95万+

猜你喜欢

转载自blog.csdn.net/weixin_44198965/article/details/105331397