PHP实现分页功能的3种方法第3/3页的完整攻略
一、分页功能的基本原理
分页功能可以理解为将一份较大的数据集合分割成若干个小的数据块,并根据用户需求一块一块地输出,从而达到减轻服务器负担和提高用户访问速度的目的。其基本原理是结合 SQL 语句中的 LIMIT 和 OFFSET 命令实现。其中,LIMIT 表示要读取多少条数据,OFFSET表示从哪条数据开始读取。
二、方法三:封装分页类
使用 PHP封装分页类,使分页功能更易于组织和调用。步骤如下:
1. 创建统一的分页类
class Pager {
private $total; //总记录数
private $pagesize; //每页显示多少条
private $limitpage; //总共多少页
private $page; //当前是第几页
private $nums; //显示多少个页码
private $url; //地址栏传递的整个URL字符串
function __construct($total,$pagesize,$nums) {
$this->total=$total;
$this->pagesize=$pagesize;
$this->nums=$nums;
$this->limitpage=ceil($this->total/$this->pagesize);
$this->page=empty($_GET['page'])?1:$_GET['page'];
$this->url=$this->getUrl();
}
2. 获取当前页码方法
private function getUrl() {
$url=$_SERVER['REQUEST_URI'];
$parse=parse_url($url);
if(isset($parse['query'])) {
parse_str($parse['query'],$params);
unset($params['page']);
$url=$parse['path'].'?'.http_build_query($params);
}
return $url;
}
public function getPage() {
$page=$this->page;
if($page<1) {
$page=1;
}
if($page>$this->limitpage) {
$page=$this->limitpage;
}
return $page;
}
3. SQL语句中用到的基本方法
public function getLimit() {
$offset=($this->getPage()-1)*$this->pagesize;
return $offset.','.$this->pagesize;
}
public function getSql() {
$offset=$this->getLimit();
return "SELECT * FROM table1 LIMIT {$offset}";
}
4. 显示页码方法
public function getPages() {
$pg=$this->nums%2==0?($this->nums/2):floor($this->nums/2)+1;
$start=$this->getPage()-$pg+1;
$start=$start<1?1:$start;
$end=$start+$this->nums-1;
$end=$end>$this->limitpage?$this->limitpage:$end;
$url=$this->url."&page=";
$pagestr='';
if($this->page>1){
$prev=$this->page-1;
$pagestr.="<a href='{$url}1'>首页</a> ";
$pagestr.="<a href='{$url}{$prev}'>上一页</a> ";
}
else {
$pagestr.="<span class='disabled'>首页</span> ";
$pagestr.="<span class='disabled'>上一页</span> ";
}
for($i=$start;$i<=$end;$i++) {
if($i==$this->page) {
$pagestr.="<span class='current'>{$i}</span> ";
}
else {
$pagestr.="<a href='{$url}{$i}'>{$i}</a> ";
}
}
if($this->page<$this->limitpage) {
$next=$this->page+1;
$pagestr.="<a href='{$url}{$next}'>下一页</a> ";
$pagestr.="<a href='{$url}{$this->limitpage}'>尾页</a> ";
}
else {
$pagestr.="<span class='disabled'>下一页</span> ";
$pagestr.="<span class='disabled'>尾页</span> ";
}
return $pagestr;
}
}
5. 使用
使用封装好的分页类,只需要几行代码即可实现分页功能:
<?php
$dbh = new PDO("mysql:host=127.0.0.1;dbname=database", "username", "password");
$total = $dbh->query('SELECT count(*) from table1')->fetchColumn(); //总记录数
$pagesize = 10; //每页显示多少条
$nums = 5; //显示多少个页码
$pager = new Pager($total,$pagesize,$nums); //初始化分页类
$limit = $pager->getLimit(); //获取SQL语句中要使用的OFFSET和LIMIT
$sql = 'SELECT * FROM table1 LIMIT '.$limit; //组合SQL语句
$stmt = $dbh->query($sql); //执行查询
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['id'].' '.$row['col1'].' '.$row['col2'].'<br/>';
}
echo $pager->getPages(); //输出页码
?>
三、示例应用
示例1:分页数据展示
<?php
//连接数据库
$dbh = new PDO("mysql:host=127.0.0.1;dbname=database", "username", "password");
//获取总记录数
$total = $dbh->query('SELECT count(*) from table1')->fetchColumn();
//每页显示多少条
$pagesize = 10;
//显示多少个页码
$nums = 5;
//初始化分页类
$pager = new Pager($total,$pagesize,$nums);
//获取SQL语句中要使用的OFFSET和LIMIT
$limit = $pager->getLimit();
//组合SQL语句
$sql = 'SELECT * FROM table1 LIMIT '.$limit;
//执行查询
$stmt = $dbh->query($sql);
//输出数据
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['id'].' '.$row['col1'].' '.$row['col2'].'<br/>';
}
//输出页码
echo $pager->getPages();
?>
示例2:分页数据展示(可根据名称和时间筛选)
<?php
//连接数据库
$dbh = new PDO("mysql:host=127.0.0.1;dbname=database", "username", "password");
//获取总记录数
$name = isset($_GET['name']) ? trim($_GET['name']) : '';
$start_time = isset($_GET['start_time']) ? strtotime(trim($_GET['start_time'])) : '';
$end_time = isset($_GET['end_time']) ? strtotime(trim($_GET['end_time'])) : '';
$where = '1=1';
if($name) {
$where .= " and name like '%".$name."%'";
}
if($start_time) {
$where .= " and create_time >= '".$start_time."'";
}
if($end_time) {
$where .= " and create_time <= '".$end_time."'";
}
$total = $dbh->query('SELECT count(*) from table1 where '.$where)->fetchColumn();
//每页显示多少条
$pagesize = 10;
//显示多少个页码
$nums = 5;
//初始化分页类
$pager = new Pager($total,$pagesize,$nums);
//获取SQL语句中要使用的OFFSET和LIMIT
$limit = $pager->getLimit();
//组合SQL语句
$sql = "SELECT * FROM table1 where ".$where." LIMIT ".$limit;
//执行查询
$stmt = $dbh->query($sql);
//输出数据
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['id'].' '.$row['col1'].' '.$row['col2'].'<br/>';
}
//输出页码
echo $pager->getPages();
?>
以上两个示例分别是基本的分页数据展示和可根据名称和时间筛选的分页数据展示,通过封装分页类,可以在不同的应用场景中直接调用,代码更易于组织和管理,大大提高了开发效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现分页功能的3种方法第3/3页 - Python技术站