这样才能知道分几页。
比如说一个列表结果是126行,如果一页20行的话那么分7页,对吧。
我们的代码经理是这样的:
计算总行数:select count(*) from tablename where …..
查询列表select * from tablename where … limit…
我们看这种方式再没有任何优化的方式下这样第个列表都是再次查询。
首先我们假设数据更新频率不是很高的情况下,我们点第1页,第2页 。。。第n页 其实第一句sql得到的都是同一个结果,这样是不是后面都在做重复工作呢。那我们第1页得到结果数后是不是可以将结果一下传递下去就行了。
例如我们分页链接第2页是这样的 list.php?page=2&count=126
在程序上加一个判断:
1.
if
(
$_get
[
'count'
]) {
2.
$count
=
$_get
[
'count'
];
3.
}
else
{
4.
$count
=select
count
(*) from tablename where …..
5.
}
这样优化以后如果我们只有第一页才计算总数,后面的页数都不用了,这样是不是就可以提升了效率。
还有这么种情况,也就是在模糊查询的情况下,我们有一个应用,我估计大部分查询结果数小于20,也就是都只有一页结果,那么如果都去计算总数是没有必要的,而且模糊查询效率也比较低。所以我突然想到跳出原来的思维,为什么一定要先计算总行数,再取列表呢?
其实完全可以先查询列表,如果列表结果数=20,那么我们再查询总行数,因为小于20的话,其实只有一页。总行数就等于查出来的列表结果数。
伪代码为:
01.
if
(
$_get
[
'page'
]<2) {
02.
$list
= select * from tablename where … limit 0,20 第一页时直接查询前20条
03.
if
(
count
(
$list
)=20) {
04.
$count
=select
count
(*) from tablename where …..
05.
}
else
{
06.
$count
=
count
(
$list
);
07.
}
08.
}
else
{
09.
$count
=
$_get
[
'count'
];
10.
$list
= select * from tablename where … limit page-1*20,page-1*20+20
11.
}
下面封装了一个function 可以供读者参考
/**
* 获取分页的HTML内容
* @param integer $page 当前页
* @param integer $pages 总页数
* @param string $url 跳转url地址 最后的页数以 '&page=x' 追加在url后面
*
* @return string HTML内容;
*/
public static
function getPageHtml($page, $pages, $url) {
//最多显示多少个页码
$_pageNum = 5;
//当前页面小于1 则为1
$page = $page < 1 ? 1 : $page;
//当前页大于总页数 则为总页数
$page = $page > $pages ? $pages: $page;
//页数小当前页 则为当前页
$pages = $pages < $page ? $page: $pages;
//计算开始页
$_start = $page - floor($_pageNum / 2);
$_start = $_start < 1 ? 1 : $_start;
//计算结束页
$_end = $page + floor($_pageNum / 2);
$_end = $_end > $pages ? $pages: $_end;
//当前显示的页码个数不够最大页码数,在进行左右调整
$_curPageNum = $_end - $_start + 1;
//左调整
if ($_curPageNum < $_pageNum && $_start > 1) {
$_start = $_start - ($_pageNum - $_curPageNum);
$_start = $_start < 1 ? 1 : $_start;
$_curPageNum = $_end - $_start + 1;
}
//右边调整
if ($_curPageNum < $_pageNum && $_end < $pages) {
$_end = $_end + ($_pageNum - $_curPageNum);
$_end = $_end > $pages ? $pages: $_end;
}
$_pageHtml = '<ul class="pagination">';
/*if($_start == 1){
$_pageHtml .= '<li><a title="第一页">«</a></li>';
}else{
$_pageHtml .= '<li><a title="第一页" href="'.$url.'&page=1">«</a></li>';
}*/
if ($page > 1) {
$_pageHtml. = '<li><a title="上一页" href="'.$url.'&page='. ($page - 1).'">«</a></li>';
}
for ($i = $_start; $i <= $_end; $i++) {
if ($i == $page) {
$_pageHtml. = '<li class="active"><a>'.$i.'</a></li>';
} else {
$_pageHtml. = '<li><a href="'.$url.'&page='.$i.'">'.$i.'</a></li>';
}
}
/*if($_end == $pages){
$_pageHtml .= '<li><a title="最后一页">»</a></li>';
}else{
$_pageHtml .= '<li><a title="最后一页" href="'.$url.'&page='.$pages.'">»</a></li>';
}*/
if ($page < $_end) {
$_pageHtml. = '<li><a title="下一页" href="'.$url.'&page='. ($page + 1).'">»</a></li>';
}
$_pageHtml. = '</ul>';
echo $_pageHtml;
}