SQL SELECT语句查询可能产生数千条记录。 但是如果在一个页面上显示所有结果并不是一个好主意。 所以可以根据需要将这个结果分成许多页面。
分页可将查询结果显示在多个页面中,而不是将它们全部放在一个长页面中。
MySQL有助于通过使用LIMIT
子句来生成分页,该子句将带有两个参数。 第一个参数为OFFSET
,第二个参数应该从数据库中返回多少条记录。
下面是一个使用LIMIT
子句获取记录来生成分页的简单示例。
示例
试试下面的例子,每页显示5
条记录。
<html>
<head>
<title>PHP+MySQL分页</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '123456';
$dbname = 'testdb';
$rec_limit = 5; // 每页显示 5 条记录
$conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) {
die('Could not connect: ' . mysqli_error());
}
mysqli_query( $conn, "SET NAMES UTF8" );
/* Get total number of records */
$sql = "SELECT count(id) FROM test_userinfo ";
$retval = mysqli_query($conn, $sql);
if(! $retval ) {
die('Could not get data: ' . mysqli_error());
}
$row = mysqli_fetch_array($retval, MYSQL_NUM );
$rec_count = $row[0];
// 总页数
$total_page = ($rec_count%$rec_limit==0)?intval($rec_count/$rec_limit): intval($rec_count/$rec_limit) + 1;
if( isset($_GET['page'] ) ) {
$page = (int)$_GET['page'];
if($page == 0){
$page = 1;
}
if($page>$total_page){ // 当前页不能超过总页数
$page = $total_page;
}
$offset = $rec_limit * ($page-1) ;
}else {
$page = 1;
$offset = 0;
}
$sql = "SELECT * ".
"FROM test_userinfo ".
"LIMIT $offset, $rec_limit";
$retval = mysqli_query( $conn, $sql );
if(! $retval ) {
die('Could not get data: ' . mysqli_error($conn));
}
while($row = mysqli_fetch_array($retval, MYSQL_ASSOC)) {
echo "编号 :{$row['id']} <br> ".
"名字 : {$row['username']} <br> ".
"--------------------------------<br>";
}
if( $page > 0 ) {
$prepage = $page - 1;
$nextpage= $page + 1;
echo "<a href = '?page=$prepage'>上一页</a> | ";
echo "<a href = '?page=$nextpage'>下一页</a> | ";
}else if( $page == 0 ) {
echo "<a href = '?page=1'>下一页</a> | ";
}
echo "<a href = '?page=$total_page'>最后一页</a>";
mysqli_close($conn);
?>
</body>
</html>
行的内容分配给变量$row
,然后打印行中的值。
注意 - 当想直接在数组中插入一个数组值的时候,总要记住使用大括号。
示例输出应该是这样的 -
下面来看看如何查询每一页的记录 -
$rec_limit
- 表示每页显示的记录数,这里假设每页显示:5
条件记录。$page
- 表示当前页。$offset
- 表示每页的开始记录数。
那么 -
第一页:
SELECT * FROM `table` LIMIT 0, $rec_limit;
-- 第一页:SELECT * FROM `table` LIMIT 0, 5;
-- 第二页:SELECT * FROM `table` LIMIT 5, 5;
-- 第三页:SELECT * FROM `table` LIMIT 10, 5;
-- 第四页:SELECT * FROM `table` LIMIT 15, 5;
下一页:
$offset = ($page+1) * $rec_limit;
SELECT * FROM `table` LIMIT $offset, $rec_limit;
上一页:
$offset = ($page-1) * $rec_limit;
SELECT * FROM `table` LIMIT $offset, $rec_limit;
最后一页:
$total_page = ($rec_count%$rec_limit==0)?intval($rec_count/$rec_limit): intval($rec_count/$rec_limit) + 1;
$offset = ($total_page-1) * $rec_limit;
SELECT * FROM `table` LIMIT $offset, $rec_limit;