最新消息:

PHP函数第1款:白羽的分页函数

PHP扩展函数 杨红伟 1717浏览 0评论

如果不想看前边的,可以直接看“DEMO演示”或者“下载案例”进行查看。

目录
一:简介
二:作者及相关
三:思路介绍
四:思路明细及代码
五:最简使用教程

一:简介

作为技术人员,在作列表时,分页是非常重要的,但是我们经常没有注重这一环节。最近做了一个商城,在做后台时,做分页时其实也很容易,用了 haowubai (即PHP100的作者张恩民)的分页类,相当不错,一下就做好了,但是它只适用于没有查询的分页!

在查询订单时,比如“校园配送”和“快递配送” 这些带参数的,就傻了眼了,为什么呢?当然是传参的问题!

其实我们想做的就是只要一个函数,或者一个类,把一个问题就搞定了。当然了,我们的水平还是有限,借鉴一下网上现成的库,或者借鉴一下高人的经验就可以。有时间了,我们再好好研究一下他们的知识,提高我们的水平。

拿来主义还是非常重要的!

 

二:作者及相关

作者:白羽

创建时间:2013-11-23

函数代码:

<?php
/**
 * 通用分页函数
 * @param	Number	$count			总记录数
 * @param	Number	$perpage		每页记录数
 * @param	Number	$page			当前页码
 * @param	String	$url			URL
 * @param	Array	$prop			给page容器传入class, id等属性,为了样式通用
 * @param	Number	$button_num		显示几个页码按钮
 * @return	String	$html
 * @author	Baiyu 2013-11-23
 */
function page($count, $perpage, $page, $url, $prop = array('class' => 'pagenavi center'), $button_num = 5, $total_at = 'left') {

	/* 开始page容器 */
	$html = '<div';
	foreach ($prop as $k => $v) {
		$html .= ' ' . $k . '="' . $v . '"';
	}
	$html .= '>' . "\n";

	//总数小于每页记录数不用分页
	if ($count <= $perpage) {
		return $html . "</div>\n";
	}

	/* 总记录条数 */
	$total_record = '<span>共' . $count . '条记录</span>' . "\n";
	$total_at == 'left' && $html .= $total_record;

	/* 上一页 */
	if ($page > 1) {
		$html .= '<a href="' . str_replace('#page#', $page - 1, $url) . '">上一页</a>' . "\n";
	}

	//重要参数计算
	$total_page = ceil($count / $perpage);
	//总页数
	$half_of_button_num = ceil($button_num / 2);
	//离首尾页多远就需要添加首尾按钮和点点了
	$need_dot = $total_page > $button_num + 2;
	//需要出现首尾按钮和点点,点点也点2个按钮位故加2
	$need_first_page = $need_dot && $page - 1 > $half_of_button_num;
	//需要首页按钮
	$need_last_page = $need_dot && $total_page - $page > $half_of_button_num;
	//需要尾页按钮
	$end_page = $need_last_page ? $page + $half_of_button_num - 1 : $total_page;
	//页码按钮结束页
	$start_page = $need_first_page ? ($need_last_page ? $page - $half_of_button_num + 1 : $end_page - $button_num) : 1;
	//页码按钮开始页

	/* 首页 */
	if ($need_first_page) {
		$html .= '<a href="' . str_replace('#page#', 1, $url) . '">1</a><span>...</span>' . "\n";
	}

	/* 页码按钮 */
	$for_length = $need_dot ? ($button_num + 2 - intval($need_first_page) - intval($need_last_page)) : $total_page;
	//无首尾页时可多放两个页码按钮且按钮总数等于总页码
	for ($i = 0; $i < $for_length; $i++) {
		$temp_page = $start_page + $i;
		$html .= ('<a' . ($temp_page == $page ? ' class="current"' : '') . ' href="' . str_replace('#page#', $temp_page, $url) . '">' . $temp_page . '</a>' . "\n");
	}

	/* 尾页 */
	if ($need_last_page) {
		$html .= '<span>...</span><a href="' . str_replace('#page#', $total_page, $url) . '">' . $total_page . '</a>' . "\n";
	}

	/* 下一页 */
	if ($page < $total_page) {
		$html .= '<a href="' . str_replace('#page#', $page + 1, $url) . '">下一页</a>' . "\n";
	}

	$total_at != 'left' && $html .= $total_record;

	/* 结束page容器 */
	$html .= '</div>' . "\n";

	return $html;
}

三:思路介绍

1:查询共几条
2:每页有几条
3:当前第几页
4:判断当前网址及赋值情况,是否赋值,及相应的页数
5:页码的样式
6:引用页码    函数进行格式化
7:SQL分页查询
8:while循环查询列表及赋值
9:显示分页结果

四:思路明细及代码

一:查询共几条

$result = $db->query($sql);
$page_total = $db->db_num_rows(); 

二:每页有几条

$page_perpage = 10;

三:当前第几页

$page_current = $_GET['page'] ? intval($_GET['page']) : 1;  

四:判断当前网址及赋值情况,是否赋值,及相应的页数

思路:
1、如果网址中有page,则开始点击分页开始切换
$page_url = preg_replace('/page=(\d+)/', 'page=#page#', $_SERVER['REQUEST_URI']);    
2、如果网址中有问号(参数),则在尾部加page
$page_url = $_SERVER['REQUEST_URI'] . '&page=#page#';
3、如果网址中无问号(参数),直接在尾部加page
$page_url = $_SERVER['REQUEST_URI'] . '?page=#page#';
    
相应代码:

if (strpos($_SERVER['REQUEST_URI'],'page=')){   
    $page_url = preg_replace('/page=(\d+)/', 'page=#page#', $_SERVER['REQUEST_URI']);    
} elseif (strpos($_SERVER['REQUEST_URI'],'?')){  
    $page_url = $_SERVER['REQUEST_URI'] . '&page=#page#';
} else {                
    $page_url = $_SERVER['REQUEST_URI'] . '?page=#page#';
}

五:页码的样式

$page_class = array('class' => 'pagenavi');

相应的class文件是:

.pagenavi { margin:15px auto; padding:0 15px; height:30px; line-height:30px; }
.pagenavi.left { text-align:left; }
.pagenavi.center { text-align:center; }
.pagenavi a,.pagenavi span { display:inline-block; padding:0 8px; height:30px; line-height:30px; }
.pagenavi a { height:28px; line-height:28px; border:1px solid #d3d3d3; }
.pagenavi a.current { background:#d3d3d3; color:#333333; }

六:引用页码    函数进行格式化

$page_html = page($page_total, $page_perpage, $page_current, $page_url,$page_class);

七:SQL分页查询

$query = $db->query($sql.' limit '.($page_current-1)*$page_perpage.','.$page_perpage);

八:while循环查询列表及格式化

while($row = $db->fetch_array()){
    echo $row['orderid'];
    echo $row['ordersn'];
}

九:显示分页结果

<?php echo $page_html; ?>

五:最简使用教程,代码如下:

<?php
	$sql="select * from php_orders where 1=1 ";
	if(!empty($_REQUEST['ordersn'])){
		$sql.=" and  ordersn like '%".$_REQUEST['ordersn']."%' ";
	}
	if(!empty($_REQUEST['delivery'])){
		$sql.=" and  delivery = ".$_REQUEST['delivery'];
	}
	$sql.=" order by orderid desc";
	
	//page start
	$db->query($sql);
	$page_total = $db->db_num_rows();
	$page_perpage = 5;
	$page_current = $_GET['page'] ? intval($_GET['page']) : 1;  //当前第几页
	if (strpos($_SERVER['REQUEST_URI'],'page=')){
		$page_url = preg_replace('/page=(\d+)/', 'page=#page#', $_SERVER['REQUEST_URI']);	
		} elseif (strpos($_SERVER['REQUEST_URI'],'?')){
		$page_url = $_SERVER['REQUEST_URI'] . '&page=#page#';
		} else {
		$page_url = $_SERVER['REQUEST_URI'] . '?page=#page#';
	}
	$page_html = page($page_total, $page_perpage, $page_current, $page_url, array('class' => 'pagenavi'));
	//page end
	
	$db->query($sql.' limit '.($page_current-1)*$page_perpage.','.$page_perpage);
	while($row = $db->fetch_array()){
		echo $row['orderid'];
	}
	
	echo $page_html; 

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址