如果不想看前边的,可以直接看“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;