分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。
数据分页的原理其实是非常简单的,它是通过SQL的LIMIT语句来实现的。
比如下面这条语句用来查询第0条开始的5条数据
SELECT * FROM user LIMIT 0,5
所以只要拼接好LIMIT语句,分页实现起来就很容易了。
比如我们使用get方式传送当前页数:那么当前页$page =$_GET['page'];
每页显示的数量我们初定义为5条 $pagesize = 5;
那么limit语句就为 limit ($pgae-1)*$pagesize,$pagesize
下面展示一下自己写的一个简单的分页类 链接数据库采用的是PDO 获取当前页数采用的是GET方法,参数为:
$pageSize,$dbname,$table,$where,$fields $offset $pageSize 为每页显示的数量 $dbname为要链接的数据库 $table 为要查询的表明 $where为查询的条件 $fields为要查询的字段 $offset为偏移量,就是要显示的页数,多余的会以省略号代替。
<?php
header('Content-type:text/html;charset=utf-8');
/**
* @var int $pageSize 每页数量
* @var string table 表名
* @var string $where 查询条件
* @var int $maxPages 最大页数
* @var int $total 总数据条数
* @var object $pdo
* @var int offset 偏移量 页码省略号两边的页数
*/
class Page{
private $pageSize,$table,$where,$maxPages,$pdo;
/**
* 分页类构造方法 初始化成员变量
* @param $pageSize 每页的数量
* @param $dbname 数据库名
* @param $table 表名
* @param $where 查询条件
* @param $fields 查询的字段
*/
public function __construct($pageSize,$dbname,$table,$where='',$fields='',$offset=5){
try{
$dsn = "mysql:host=localhost;dbname=$dbname;charset=utf8";
$this->pdo = new PDO($dsn,'root','');
$this->pdo->setAttribute(3,2);
$this->table = $table;
$this->where = trim($where);
$this->pageSize = intval($pageSize);
$this->total = $this->getTotal();
$this->fields = $fields;
$this->offset = intval($offset);
$this->maxPages = ceil(($this->total)/$pageSize);
}catch(PDOException $e){
echo $e->getMessage();
}
}
/**
* 返回按分页查询的数据
*/
public function index(){
try{
$maxPages = $this->maxPages;
$table = $this->table;
//总页数
$total = $this->getTotal();
//当前页书
$getPages = (int)$_GET['page'];
$page = (($getPages>0) &&($getPages<=$maxPages))?$getPages:1;
$pageSize = $this->pageSize;
//limit条件
$start = $pageSize*($page-1);
$limit = "limit $start,$pageSize";
//where条件
$where = $this->where;
$fields = $this->fields?$this->fields:'*';
$sql = "select $fields from $table ".$where." ".$limit;
$re = $this->pdo->query($sql);
foreach($re as $v){
$list[] = $v;
}
$pages = $this->getPages($pageSize,$total,$this->maxPages,$page,$this->offset);
$tmp['info'] = $list;
$tmp['pages'] = $pages;
return $tmp;
}catch(PDOException $e){
echo $e->getMessage();
}
}
/**
* 生成页数链接
*/
private function getPages($pageSize,$total,$maxPages,$page,$offset){
$str = '<ul style = "list-style-type:none">';
$str .='<li><a href = "?page=1">首页</a></li>';
$str .=$this->prev($page);
$tmpStr = '';
for($i = 1;$i<$maxPages+1;$i++){
$tmpStr .="#<li><a href = '?page=".$i."'>第".$i."页</a></li>";
}
$tmpStr = $this->MOffset($page,$tmpStr,$offset,$maxPages);
$str .=$tmpStr;
$str .=$this->next($page,$maxPages);
$str .='<li><a href = "?page='.$maxPages.'">尾页</a></li>';
$str .= '</ul>';
return $str;
}
/**
* 下一页
*/
private function next($page,$maxPages){
if($page<$maxPages){
$page++;
$str ='<li><a href = "?page='.$page.'">下一页</a></li>';
}else{
$str ='';
}
return $str;
}
/**
* 上一页
*/
private function prev($page){
if($page>1){
$page--;
$str ='<li><a href = "?page='.$page.'">上一页</a></li>';
}else{
$str ='';
}
return $str;
}
/**
* 处理页码offset
*/
private function MOffset($page,$tmpStr,$offset,$maxPages){
$arr = explode('#',$tmpStr);
array_shift($arr);
$num = count($arr);
//开始
$start = $page-$offset;
if($start>($maxPages-$offset*2)){
$start = $maxPages-$offset*2;
}
if($start<0){
$start = 0;
}
$o1 = ($start>0)?'<li>...</li>':false;
//长度
$len = $offset*2;
if(($start+$len)<$maxPages){
$o2 = '<li>...</li>';
}
$arr = array_slice($arr,$start,$len);
if($o1){
array_unshift($arr,$o1);
}
if($o2){
$arr[] = $o2;
}
$tmpStr = implode('',$arr);
return $tmpStr;
}
/**
* @return 返回 总条数
*/
private function getTotal(){
$where = $this->where;
$table = $this->table;
$sql = "select count(*) from $table $where";
$re = $this->pdo->query($sql);
return $re->fetch(PDO::FETCH_NUM)['0'];
}
}
?>
下面我们实际调用下这个分页类:<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
ul li{float: left;margin-right: 10px;}
th{font-weight: normal;width: 176px;border: 1px solid #ddd;}
</style>
</head>
<body>
<?php
include('./a.php');
//调用分页类
$page = new Page('3','erhaodian','cmstop_category','','catid,name,pinyin','2');
$re = $page->index();
$str= "<table><tr><th>编号</th><th>名字</th><th>拼音</th></tr>";
foreach($re['info'] as $v){
$str .=<<<EOF
<tr>
<th>{$v['catid']}</th>
<th>{$v['name']}</th>
<th>{$v['pinyin']}</th>
</tr>
EOF;
}
$str.= '</table>';
echo $str;
echo $re['pages'];
?>
</body>
</html>
输出结果为: