制作分页
在真实的项目中,我们是将主机、用户名、密码、库都写在配置文件当中。
如果在代码中写死了,万一数据库服务器的相关信息发生变化了,要把所有代码修改一次显然不符合程序员的思维。
此外,在每一个需要连接数据库的页面中。我们都需要写上连接、判断错误、设置字符集、太过于麻烦。并且不利于重复使用这些代码。
我们可以用上之前讲过的include系列函数达成目标。示例图如下:

因此,我们可以做一个配置文件config.php。将需要使用到的配置全部设置为常量,代码如下:
<?php
//数据库服务器
define('DB_HOST', 'localhost');
//数据库用户名
define('DB_USER', 'root');
//数据库密码
define('DB_PWD', 123456789);
//库名
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';
把上面的准备工作完成,接下来完成分页。分页效果如下:

页要实现分页中包含以下几个基本元素:


我们在控制页码的时候,都是通过URL地址栏传入页码值来实现的页码控制。在page.php后面接上页码的相关信息,我们就能够算出更多的有效信息。url控制分页的效果如下:

在代码实现中,是通过limit后的偏移量(offset)和数量(num),这两个值真正实现的分页。
limit offset , num

假设每页显示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>';
我们最后将整体业务串联起来实现最终效果,代码如下:
<?php
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);
?>分页原理
1、首先了解SQL语句中的limit用法
SELECT * FROM table …… limit 开始位置 , 操作条数 (其中开始位置是从0开始的)
例子:
取前20条记录:SELECT * FROM table …… limit 0 , 20
从第11条开始取20条记录:SELECT * FROM table …… limit 10 , 20
LIMIT n 等价于 LIMIT 0,n。
如select * from table LIMIT 5; //返回前5行,和 select * from table LIMIT 0,5一样
2、分页原理
所谓分页显示,也就是讲数据库中的结果集,一段一段显示出来
怎么分段,当前在第几段 (每页有几条,当前再第几页)
前10条记录:select * from table limit 0,10
第11至20条记录:select * from table limit 10,10
第21至30条记录:select * from table limit 20,10
分页公式:
(当前页数 - 1 )X 每页条数 , 每页条数
Select * from table limit ($Page- 1) * $PageSize, $PageSize
3、$_SERVER["REQUEST_URI"]函数
预定义服务器变量的一种,所有$_SERVER开头的都叫做预定于服务器变量。
REQUEST_URI的作用是取得当前URI,也就除域名外后面的完整的地址路径。
例子:
当前页为:http://www.test.com/home.php?id=23&cid=22
echo $_SERVER["REQUEST_URI"]
结果为:/home.php?id=23&cid=22
4、parse_url()解析URL函数
parse_url() 是讲URL解析成有固定键值的数组的函数
例子
$ua=parse_url("http://username:password@hostname/path?arg=value#anchor");
print_r($ua);结果:
Array
(
[scheme] => http ;协议
[host] => hostname ;主机域名
[user] => username ;用户
[pass] => password ;密码
[path] => /path ;路径
[query] => arg=value ;取参数
[fragment] => anchor ;
)
5、代码实例
这个一个留言的分页,分为3个部分,一个是数据库设计,一个是连接页面,一个是显示页面。
(1)设计数据库
设计数据库名为bbs,有一个数据表为message,里面包含title,lastdate,user,content等字段,分别表示留言标题,留言日前,留言人,留言的内容
(2)连接页面
<?php
$conn = @ mysql_connect("localhost", "root", "123456") or die("数据库链接错误"); mysql_select_db("bbs", $conn); mysql_query("set names 'GBK'"); //使用GBK中文编码;
//将空格,换行转换为HTML可解析
function htmtocode($content) { $content = str_replace("\n", "<br>", str_replace(" ", " ", $content)); //两个str_replace嵌套
return $content; }
//$content=str_replace("'","‘",$content); //htmlspecialchars();
?>(3)显示页面
<?php
include("conn.php");
$pagesize=2;
//设置每页显示2个记录 $url=$_SERVER["REQUEST_URI"];
$url=parse_url($url);
$url=$url[path];
$numq=mysql_query("SELECT * FROM `message`");
$num = mysql_num_rows($numq);
if($_GET[page]){ $pageval=$_GET[page];
$page=($pageval-1)*$pagesize;
$page.=',';
}
if($num > $pagesize)
{
if($pageval<=1)$pageval=1;
echo "共 $num 条". " <a href=$url?page=".($pageval-1).">上一页</a>
<a href=$url?page=".($pageval+1).">下一页</a>";
}
$SQL="SELECT * FROM `message` limit $page $pagesize ";
$query=mysql_query($SQL);
while($row=mysql_fetch_array($query)){
?><table width=500 border="0" cellpadding="5" cellspacing="1" bgcolor="#add3ef"> <tr bgcolor="#eff3ff"> <td>标题:<?php echo $row[title]?></td> <td>时间:<?php echo $row[lastdate]?></td> </tr> <tr bgcolor="#eff3ff"> <td> 用户:<?php echo $row[user]?></td><td></td> </tr> <tr> <td>内容:<?php echo htmtocode($row[content]);?></td> </tr> <br> </table>

baby不要哭泣
分页使用的比较多
8年前 添加回复 0