PHP分页,看到有些虎友需要

@Ta 2014-02-08 6695点击
首先分页你得先查出数据的总记录数$total,sql就是这样:
select count(1) from table

再设置每页要显示的条数$limit
那么显示第1页的sql就是这样:
select * from table limit $limit offset $limit*(1-1)

第2页的sql就是这样:
select * from table limit $limit offset $limit*(2-1)

第3页的sql就是这样:
select * from table limit $limit offset $limit*(3-1)

...
上面的分页sql看起来好像跟总记录数没有关系啊(⊙o⊙)…,但是还有有作用的,根据总记录数可以计算出总页数,有了总页数就可以防止用户点击无效的下一页(当下一页大于总页数时,是无效的页数,就是没有数据的一页)
例子:
message.php:
<?php

$total = select count(1) from table; //$total是你查出的总记录数
$limit = 10; //$limit是每页显示的条数
$LastPage = ceil($total/$limit); //$LastPage为尾页,也就是总页数函数ceil就是向上取整数,如:ceil(3.3) == 4 ceil(3.7) == 4
$pageno = $_GET['pageno'] == null ? 1 : $_GET['pageno']; //$pageno为当前的页数,默认为第1页
if($pageno > $LastPage) {
    $pageno = $LastPage;
}
if($pageno < 1) {
    $pageno = 1;
}
$messageArray = select * from table limit $limit offset $limit*($pageno-1); //这就是当前页数的数据
?>
<html>
<head><title>分页</title></head>
<body>
<?php
if($messageArray) {
    foreach($messageArray as $message) {
        //循环写出数据
    }
} else {
    echo '没有记录';
}
?>
<a href="message.php?pageno=1">首页</a>
<a href="message.php?pageno=<?php echo $pageno-1; ?>">上一页</a>
<a href="message.php?pageno=<?php echo $pageno+1; ?>">下一页</a>
<a href="message.php?pageno=<?php echo $LastPage; ?>">尾页</a>
</body>
</html>

上面这样基本可以实现分页了吧,大牛勿喷,也不知道写错没有!
如果你需要精简分页你还可以写个分页类,如下:
<?php

class Page {
	
	private $pageno;
	private $total;
	private $limit;
	
	public function __construct() { }
	
	/**
	 * 设置当前页数
	 * @param unknown $pageno
	 */
	public function setPageno($pageno) {
		$this->pageno = $pageno;
	}
	
	/**
	 * 设置总记录数
	 * @param unknown $total
	 */
	public function setTotal($total) {
		$this->total = $total;
	}
	
	/**
	 * 设置limit
	 * @param unknown $limit
	 */
	public function setLimit($limit) {
		$this->limit = $limit;
	}
	
	/**
	 * 获取当前页码
	 */
	public function getPageno() {
		return $this->pageno;
	}
	
	/**
	 * 获取总记录数
	 */
	public function getTotal() {
		return $this->total;
	}
	
	/**
	 * 获取总页数
	 * @return number
	 */
	public function getPageNum() {
		return ceil($this->total/$this->limit);
	}
	
	/**
	 * 获取第一页
	 * @return number
	 */
	public function getFirstPage() {
		return 1;
	}
	
	/**
	 * 获取最后一页
	 */
	public function getLastPage() {
		return $this->getPageNum();
	}
	
	/**
	 * 获取上一页
	 * @return number
	 */
	public function getPrePage() {
		if($this->getPageno() > 1) {
			return $this->getPageno() - 1;
		} else {
			return 1;
		}
	}
	
	/**
	 * 获取下一页
	 * @return number
	 */
	public function getNextPage() {
		if($this->getPageno() < $this->getPageNum()) {
			return $this->getPageno() + 1;
		} else {
			return $this->getPageNum();
		}
	}
	
	public function getLimit() {
		return $this->limit;
	}
	
	public function getOffset() {
		return $this->getLimit()*($this->getPageno()-1);
	}
	
}

?>

需要分页的时候先实例化这个类
$page = new Page();
再设置total
$page->setTotal($total);
再设置limit
$page->setLimit($limit);
再设置当前页码
$page->setPageno($pageno);
这样就可以直接得到limit和offset,分页sql就可以这样写
$sql = "select * from table limit ".$page->getLimit()." offset ".$page->getOffset();

上一页的url:message.php?pageno=$page->getPrePage()
下一页的url: message.php?pageno=$page->getNextPage()
这又写了这么多,不管错没有,都写上来了,希望给分页有困难的撸友一些帮助,有错的可以提出来,我会更正的,谢谢!
回复列表(17|隐藏机器人聊天)
添加新回复
回复需要登录