13.4 把用户做个分页
在真实的项目中,我们是将主机、用户名、密码、库都写在配置文件当中。
如果在代码中写死了,万一数据库服务器的相关信息发生变化了,要把所有代码修改一次显然不符合程序员的思维。
此外,在每一个需要连接数据库的页面中。我们都需要写上连接、判断错误、设置字符集、太过于麻烦。并且不利于重复使用这些代码。
我们可以用上之前讲过的 include 系列函数达成目标。示例图如下:
因此,我们可以做一个配置文件 config.php。将需要使用到的配置全部设置为常量,代码如下:
<?php
<?php
//数据库服务器
define('DB_HOST', 'localhost');
//数据库用户名
define('DB_USER', 'root');
//数据库密码
define('DB_PWD', 'secret');
//库名
define('DB_NAME', 'book');
//字符集
define('DB_CHARSET', 'utf8');
我们将 connection.php 页面抽取出来,以后需要连接数据库的时候只需要包含 connection.php 文件即可。代码如下:
<?php
include 'config.php';
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PWD, DB_NAME);
if (mysqli_errno($conn)) {
mysqli_error($conn);
exit;
}
mysqli_set_charset($conn, DB_CHARSET);
我们在以后每个文件使用中直接包含 connection.php 文件就可以实现数据库连接了:
include 'connection.php';
把上面的准备工作完成,接下来完成分页。分页效果如下:
页要实现分页中包含以下几个基本元素:
元素 | 说明 | 备注 |
---|---|---|
首页 | 最开始进入到页面的第一页 | 用 get 传参才进去时默认为 1 |
上一页 | 当前页减 1 | 如果页码为第一页时减 1,为应该为第一页 |
下一页 | 当前页加 1 | 如果页码为最后一页时减 1,应该为最后一页 |
尾页 | 最后一页 | 总条数除以每页显示数得到总页数 |
当前页 | 当前所在的页码 | 就是当前的页码 |
总页数 | 一共有多少个页面 | 总条数除以每页显示数 |
我们在控制页码的时候,都是通过 URL 地址栏传入页码值来实现的页码控制。在 page.php 后面接上页码的相关信息,我们就能够算出更多的有效信息。url 控制分页的效果如下:
在代码实现中,是通过 limit 后的偏移量(offset) 和数量(num),这两个值真正实现的分页。
limit offset , num
页码 | url 中 get 值 | limit 偏移量,数量 |
---|---|---|
第 1 页 | 1 | 0,5 |
第 2 页 | 2 | 5,5 |
第 3 页 | 3 | 10,5 |
第 n 页 | n | (n-1)*5,5 |
假设每页显示 5 条。最终得到的分页中控制 limit 公式如下:
offset 的值为 (n-1)*5
num 为规定的 5
我们通过代码来实现业务:
一、计算出分页所需的参数
总数
通过查询 user 表的 count(id),得到总数$count。
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到总的用户数
$count = $data['c'];
当前页
刚进入 page.php 页时,url 为 http://www.phpxy.com/page.php,后面是不存在 ?page=1 页面标识号的。
因此我们需要手动创建一个页面标识号传给当前页码变量$page。
我们害怕用户传的页面中存在小数等,所以我们做一次强制的类型转换:(int) $_GET['page']。
第一种写法:
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
第二种写法
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
最后一页
每一页一定是一个整数。就跟小学的时候数学一样。平均有 5.6 个人应该准备几个苹果。答案一定是 6 个。
如果页面出来了 20.3 个页面,一定是使用进一法取整函数 ceil。让分页数变为 21。
我们用总数除以每页显示的数据条数,就得到了总页数了。
//每页显示数
$num = 5;
$total = ceil($count / $num);
上一页、下一页异常情况控制
如果用户的在第一页点击了上一页,在最后一页点击了下一页怎么办呢?
这样的话数据会超出范围,而造成我们分页时无数据显示。
显然这种异常情况需要考虑到。因此,如果在分页时在第一页减一时,我们就让他为第一页。
在最后一页加一时,我们就让他为最后一页,即完成了异常控制。
if ($page <= 1) {
$page = 1;
}
if ($page >= $total) {
$page = $total;
}
二、SQL 语句
我们之前说过分页的核心是通过 SQL 语句中的 offset 和 num 来控制每页显示数。
我们在上面还列了具体的公式,我们将公司转化为代码如下:
$num = 5;
$offset = ($page - 1) * $num;
我们将$num 和$offset 应用于 SQL 语句中:
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
控制好 URI 中的分页值
echo '<tr>
<td colspan="5">
<a href="page.php?page=1">首页</a>
<a href="page.php?page=' . ($page - 1) . '">上一页</a>
<a href="page.php?page=' . ($page + 1) . '">下一页</a>
<a href="page.php?page=' . $total . '">尾页</a>
当前是第 ' . $page . '页 共' . $total . '页
</td>
</tr>';
我们最后将整体业务串联起来实现最终效果,代码如下:
include 'connection.php';
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到总的用户数
$count = $data['c'];
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
/*
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
*/
//每页显示数
$num = 5;
//得到总页数
$total = ceil($count / $num);
if ($page <= 1) {
$page = 1;
}
if ($page >= $total) {
$page = $total;
}
$offset = ($page - 1) * $num;
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
$result = mysqli_query($conn, $sql);
if ($result && mysqli_num_rows($result)) {
//存在数据则循环将数据显示出来
echo '<table width="800" border="1">';
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
echo '<td>' . $row['username'] . '</td>';
echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>';
echo '<td>' . long2ip($row['createip']) . '</td>';
echo '<td><a href="edit.php?id=' . $row['id'] . '">编辑用户</a></td>';
echo '<td><a href="delete.php?id=' . $row['id'] . '">删除用户</a></td>';
echo '</tr>';
}
echo '<tr><td colspan="5"><a href="page.php?page=1">首页</a> <a href="page.php?page=' . ($page - 1) . '">上一页</a> <a href="page.php?page=' . ($page + 1) . '">下一页</a> <a href="page.php?page=' . $total . '">尾页</a> 当前是第 ' . $page . '页 共' . $total . '页 </td></tr>';
echo '</table>';
} else {
echo '没有数据';
}
mysqli_close($conn);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论