简单的数据分页

    分页显示是一种非常常见的浏览和显示大量数据的方法,属于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>

    输出结果为:

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值