PHP分页功能是Web开发中经常需要用到的功能之一,它可以帮助我们在应对大量数据时保持页面的快速响应速度,提高用户体验。下面我们将从入门到精通讲解快速实现PHP分页功能的方法。
一.分页功能的基本概念
在开发网站或应用程序时,我们通常需处理大量数据。一般情况下,我们会将数据分页展示在多个页面中。为了方便用户访问,我们还需在页面上提供“上一页”、“下一页”等导航功能,使得用户可以随意翻页。
分页功能的实现,通常需要完成以下几个任务:
1.计算总页数:计算所有数据需要分成几页;
2.计算当前页数:确定当前页是第几页;
3.计算每页数据量:确定每页展示多少条数据;
4.制作导航栏:根据计算结果,生成导航栏。
下面,我们将详细讲解如何实现PHP分页功能。
二.计算总页数
假设我们需要显示一些留言,每页展示10条留言。首先,我们需要确定我们有多少条留言。如果我们已经知道总留言数,可以使用下列代码计算出总页数:
$total_pages = ceil($total_rows / $page_size);
其中,$total_rows 为总留言数,$page_size 为每页显示的留言数,$total_pages 为总页数。 ceil 函数用于向上取整,这里将总留言数除以每页显示的留言数得到需要的页面数,如果有余数,则向上取整。
三.计算当前页数
在分页程序中,我们需要取得当前页的页码。可以使用 $_GET 全局变量获取客户端提交的页码信息,如下:
$page = isset($_GET['page']) ? $_GET['page'] : 1;
上述代码检测 $_GET['page'] 是否设置,假如没有设置则默认取第一页,如果设置了则取指定页的页码。因此应该将 $page 参数传入 SQL 语句中,以得到需要的页的数据。
四.计算每页数据量
在分页程序中,我们还需要计算每页数据量,可以使用下列代码:
$page_size = 10;
其中,$page_size 为每页显示的数据量,可以根据具体需要进行调整。
五.制作导航栏
制作导航栏通常需要先计算当前页相邻的页数,然后才能根据需要制作出导航栏。如果当前页的页码是 $page,总页数是 $pages,假设我们需要在导航栏里显示前后相邻的 $num 页,可以使用以下代码:
$nav = '';
$num = 3;
if($page > 1){
$nav .= '上一页';
}
for($i = $num; $i >= 1; $i--){
$v = $page - $i;
if($v >= 1){
$nav .= ''.$v.'';
}
}
$nav .= ''.$page.'';
for($i = 1; $i <= $num; $i++){
$v = $page + $i;
if($v <= $pages){
$nav .= ''.$v.'';
}else{
break;
}
}
if($page != $pages){
$nav .= '下一页';
}
上述代码用于生成页码导航栏。如果当前页码 $page 大于 1,就显示一个“上一页”的链接;然后显示当前页左边的 $num 页;接着是显示当前页,显示方式略有不同(这里采用了一个带有特殊样式类的正文);最后是当前页右边的 $num 页;最后,如果当前不是最后一页,我们还需显示一个“下一页”的链接。
六.分页程序的完整代码
上述代码可能不够完整,下面是一个完整的 PHP 分页程序示例:
$page = isset($_GET['page']) ? $_GET['page'] : 1;
$page_size = 10;
// 下面是要执行的SQL语句
$sql = "select * from message order by id desc";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$total_rows = $stmt->rowCount();
// 如果总行数不为 0
if($total_rows){
// 计算总页数
$fn = ceil($total_rows / $page_size);
// 计算本页开始行号
$start_row = ($page - 1) * $page_size;
// SQL中的LIMIT语句
$sql .= " limit $start_row, $page_size";
$stmt = $pdo->prepare($sql);
$stmt->execute();
// 打印出本页数据
while($row = $stmt->fetch()){
echo $row['id'] . ' ' . $row['message'] . '
';
}
// 制作页码导航栏
$nav = '';
$num = 3;
if($page > 1){
$nav .= '上一页';
}
for($i = $num; $i >= 1; $i--){
$v = $page-$i;
if($v >= 1){
$nav .= ''.$v.'';
}
}
$nav .= ''.$page.'';
for($i = 1; $i <= $num; $i++){
$v = $page+$i;
if($v <= $fn){
$nav .= ''.$v.'';
}else{
break;
}
}
if($page != $fn){
$nav .= '下一页';
}
// 显示页码导航栏
echo '