PHP员工管理系统中数据库实现复杂分页效果
1、 考核知识点
分页显示的业务逻辑
2、 练习目标
Ø 根据需求完成指定形式的分页样式
3、 需求分析
分页链接的显示样式也是一个网站中相对重要的环节,好的分页样式能增加用户的体验。下面就 在【案例13】的基础上,修改生成分页链接的方法,完成一个相对灵活的分页样式。
该分页样式由“首页”、“尾页”以及指定数量的中间页码组成。具体效果如下图所示。
首页显示效果
尾页显示效果
4、 设计思路
1) 修改page_function.php,能够灵活控制显示的页码数量。
2) 循环输出指定数量的页码链接。
3) 判断显示的页码前后是否还有分页,并进行相关处理。
4) 为分页链接添加相关样式。
1、修改page_function.php,能够灵活控制显示的页码数量。具体代码如下:
<?php
/**
* 分页链接生成函数
* $page URL传递的page值
* $max_page 最大页码值
* $show_page_num 页面中显示多少页码
*/
function makePageHtml($page, $max_page, $show_page_num = 5) {
……
}
在上述代码中,为makePageHtml()函数添加一个形式参数$show_page_num,该参数用来指定页面中显示的页码数量,并为其设置默认值为5。
2、循环输出指定数量的页码链接。
这一步是实现整个分页样式至关重要的一步,首先需要认真分析分页链接该如何循环输出。我们需要实现的是:一次显示指定数量的页码,例如“1 2 3 4 5”、“6 7 8 9 10”。
这里面就需要我们确定2个问题:
① 当前显示的页码第一位的数字
② 当前显示的页码最后一位的数字
那么根据现有条件,我们可以知道页面中显示的页码数量、当前选择的页码值以及最大页码值,这三个数值都是在调用makePageHtml()函数时需要传递的参数。
通过分析我们可以把“1 2 3 4 5”、“6 7 8 9 10”这样的页码看做一个小组,每组的最小值就是当前页码的第一位数字,最大值就是最后一位数字。只要我们知道当前显示的页码是第几组,就可以算出当前显示的第一位和最后一位。
下面定义$page_grep表示当前页码所属组,通过分析其与页码数量之间的数学关系可以得到下面的表达式:
$page_grep = ceil($page / $show_page_num);
当前页码属于第几组,可以通过$page和$show_page_num相除并向上取整来确定。
接下来就可以确定当前分组的第一位页码的数字,下面定义$i表示该数字,通过分析可以得到下面的表达式:
$i = $show_page_num * ($page_grep - 1) + 1;
然后确定当前分组的最后一位页码的数字,下面定义$max表示该数字,通过分析可以得到下面的表达式:
$max = $page_grep * $show_page_num;
而实际上当前分组最后一位页码的数字可能小于$max,因此需要加以判断,判断表达式如下:
$max_i = ($max <= $max_page) ? $max : $max_page;
最后就可以根据上述条件进行循环输出页码,具体代码如下:
<?php
/**
* 分页链接生成函数
* $page URL传递的page值
* $max_page 最大页码值
* $show_page_num 页面中显示多少页码
*/
function makePageHtml($page, $max_page, $show_page_num = 5) {
//设置变量,保留GET参数
$prams = '';
//删除GET参数中的page
unset($_GET['page']);
//循环遍历$_GET数组,重新拼接URL中的GET参数
foreach ($_GET as $k => $v) {
$prams .= "$k=$v&";
}
//重新拼接分页链接的html代码
$page_html = '<a href="?' . $prams . 'page=1">首页</a> ';
//使用当前页页码和页面显示页码量计算出
$page_grep = ceil($page / $show_page_num);
$i = $show_page_num * ($page_grep - 1) + 1;
$max = $page_grep * $show_page_num;
$max_i = ($max <= $max_page) ? $max : $max_page;
for ($i; $i <= $max_i; $i++) {
$page_html .= '<a href="?' . $prams . 'page=' . $i . '">' . $i . '</a> ';
}
$page_html .= '<a href="?' . $prams . 'page=' . $max_page . '">尾页</a> ';
//返回分页链接
return $page_html;
}
完成上述步骤后,就可以随意控制显示的页码数量进行分页了,例如我们选择显示4个页码,则结果如下图所示。
3、判断显示的页码前后是否还有分页,并进行相关处理。
此时还有一个问题没有解决,第4页之后还有分页该怎么办。这就需要我们在循环页码的时候进行判断,如果当前显示的页码之后还有分页,则在页码最后显示“>”表示后面还有内容,例如“1 2 3 4 5 >”。如果当前显示的页码之前还有分页,则在页码最前显示“<”表示前面还有内容,例如“< 6 7 8 9 10”。关键部分代码如下:
for ($i; $i <= $max_i; $i++) {
//判断是否有上一页
if (($i + $show_page_num - 1) % $show_page_num == 0 && $i > 1) {
$page_html .= '<a href="?' . $prams . 'page=' . ($i - 1) . '"><</a> ';
}
//输出当前页页码
$page_html .= '<a href="?' . $prams . 'page=' . $i . '">' . $i . '</a> ';
//判断是否有下一页
if ($i % $show_page_num == 0 && $i < $max_page) {
$page_html .= '<a href="?' . $prams . 'page=' . ($i + 1) . '">></a> ';
}
}
最后为了突出显示当前是哪一页,还需要判断并添加不同的样式,最终分页代码如下:
for ($i; $i <= $max_i; $i++) {
//判断是否有上一页
if (($i + $show_page_num - 1) % $show_page_num == 0 && $i > 1) {
$page_html .= '<a href="?' . $prams . 'page=' . ($i - 1) . '"><</a> ';
}
//判断是否为当前选中页
if($i == $page){
$page_html .= '<a class = "curl" href="?' . $prams . 'page=' . $i . '">' . $i . '</a> ';
}else{
$page_html .= '<a href="?' . $prams . 'page=' . $i . '">' . $i . '</a> ';
}
//判断是否有下一页
if ($i % $show_page_num == 0 && $i < $max_page) {
$page_html .= '<a href="?' . $prams . 'page=' . ($i + 1) . '">></a> ';
}
}
4、为分页链接添加相关样式,并修改showList.php文件,调用makePageHtml()函数来生成分页链接的html代码。
html模板文件中有关分页链接的样式代码如下:
.page{font-size:12px;float:right;}
.page a{padding: 2px 6px;background-color: #DFDFDD;color:#454545;display: block;float: left;margin-left:5px;text-decoration: none;font-family: verdana;}
.page .curl{background-color: #999999;color: #FFFFE0;}
.page a:hover{background-color: #999999;color: #FFFFE0;}
showList.php文件调用makePageHtml()函数,代码如下:
<?php
header('content-type:text/html;charset=utf-8');
require './page_function.php';
//获取数据库连接并选择数据库
mysql_connect('localhost', 'root', '123456') or die('连接数据库失败!' . mysql_error());
mysql_query('set names utf8');
mysql_query('use itcast');
//获取最大分页数
$page_size = 2;
$res = mysql_query('select count(*) from emp_info');
$count = mysql_fetch_row($res);
$count = $count[0];
$max_page = ceil($count / $page_size);
//获取当前选择的页码,并作容错处理
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$page = $page > $max_page ? $max_page : $page;
$page = $page < 1 ? 1 : $page;
//组合分页链接
$page_html = makePageHtml($page, $max_page);
//拼接查询语句并执行,获取查询数据
$lim = ($page - 1) * 2;
$sql = "select emp.e_id,emp.e_name,emp.date_of_birth,emp.date_of_entry,dept.d_name from emp_info as emp
left join emp_dept as dept
on emp.d_id = dept.d_id limit {$lim},{$page_size}";
$res = mysql_query($sql);
//读取数据并作相关处理
$emp_info = array();
while ($row = mysql_fetch_assoc($res)) {
$emp_info[] = $row;
}
//设置常量,用以判断视图页面是否由此页面加载
define('APP', 'itcast');
//载入视图页面
require './list_html.php';
完成上述修改后,复杂分页样式效果就制作完成,如下图所示。
三、案例总结
1、分页样式需要考虑的就是分页相关数据间的数学关系,只要清楚了其中的数学关系就能够轻松完成复杂分页显示。