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);
文章导航