在真实的项目中,我们是将主机、用户名、密码、库都写在配置文件当中。 如果在代码中写死了,万一数据库服务器的相关信息发生变化了,要把所有代码修改一次显然不符合程序员的思维。 此外,在每一个需要连接数据库的页面中。我们都需要写上连接、判断错误、设置字符集、太过于麻烦。并且不利于重复使用这些代码。 我们可以用上之前讲过的include系列函数达成目标。示例图如下: ![](https://box.kancloud.cn/2015-10-13_561c9c5350f16.png) 因此,我们可以做一个配置文件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'; ~~~ 把上面的准备工作完成,接下来完成分页。分页效果如下: ![](https://box.kancloud.cn/2015-10-13_561c9c536b206.png) 页要实现分页中包含以下几个基本元素: | 元素 | 说明 | 备注 | | -- | -- | -- | | 首页 | 最开始进入到页面的第一页 | 用get传参才进去时默认为1 | | 上一页 | 当前页减1 | 如果页码为第一页时减1,为应该为第一页 | | 下一页 | 当前页加1 | 如果页码为最后一页时减1,应该为最后一页 | | 尾页 | 最后一页 | 总条数除以每页显示数得到总页数 | | 当前页 | 当前所在的页码 | 就是当前的页码 | | 总页数 | 一共有多少个页面 | 总条数除以每页显示数 | 我们在控制页码的时候,都是通过URL地址栏传入页码值来实现的页码控制。在page.php后面接上页码的相关信息,我们就能够算出更多的有效信息。url控制分页的效果如下: ![](https://box.kancloud.cn/2015-10-13_561c9c5386e2d.png) 在代码实现中,是通过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); ~~~