MySQLi新闻分页案例

1 分页简介

当列表中的记录非常多时,为了方便查询,使用分页功能。

2 分页效果


3 分页原理

利用LIMIT关键字限制SELECT语句查询出的数据

SELECT * FROM news LIMIT 0,3;  # 查询第1页的3条数据
SELECT * FROM news LIMIT 3,3; # 查询第2页的3条数据

# 第1个参数与页码之间存在一定的数学关系。
# 第2个参数表示每次查询的最大条数。

# LIMIT第1个参数计算方式:LIMIT 第1个参数 = (页码 - 1) * 每页查询的条数

4 开发思路

定义变量:定义页码和查询条数变量。
查询总记录数:查询新闻表中的总记录数,计算出总页数。
计算LIMIT参数:根据当前页码计算出LIMIT的两个参数值,拼接查询语句。
分页导航:添加“首页”“上一页” “下一页”“末页”分页导航。
页码链接:当总页数小于或等于7时,显示所有的页码数。
页码链接:总页数大于7页、当前页小于等于5时,生成数字导航链接。
页码链接:总页数大于7页,当前页大于5时,生成数字导航链接。
显示分页:在页面中显示分页内容。

5 页码链接


6 具体实现

1)定义变量:定义页码和查询条数变量

$page = $_GET['page'] ?? 1;        // 当前页码
$pagecount = 4; // 每页显示的条数

2)查询总记录数:查询新闻表中的总记录数,计算出总页数

$count_sql = 'SELECT count(*) AS total FROM news';
$res = read($conn, $count_sql, $error);
$count = $res['total'] ?? 0;
$pages = ceil($count / $pagecount);

3) 根据页码计算LIMIT参数:计算LIMIT参数,替换查询语句

$offset = ($page - 1) * $pagecount;         // 计算分页的第1个参数值
$limit = " LIMIT $offset,$pagecount";
$sql = "SELECT n.*,a.name FROM news n LEFT JOIN author a
ON n.a_id=a.id ORDER BY n.id " . $limit;
$news = read($conn, $sql, $error, true);

4)分页导航:添加“首页”“上一页” “下一页”“末页”分页导航

$pageinfo = '';
$pageinfo .= "<a href=\"index.php?page=1\">首页</a>";
if ($page != 1) {
$prev = $page - 1;
$pageinfo .= "<a href=\"index.php?page={$prev}\">上一页</a>";
}
// (在此处添加具体页码)……
if ($page != $pages) {
$next = $page + 1;
$pageinfo .= "<a href=\"index.php?page={$next}\">下一页</a>";
}
$pageinfo .= "<a href=\"index.php?page={$pages}\">末页</a>";

5)页码链接1:当总页数小于或等于7时,显示所有的页码数

if ($pages <= 7) {
for ($i = 1; $i <= $pages; $i++) {
if ($page == $i) {
$pageinfo .= “<a class=\"current\" href=\"index.php?page={$i}\">{$i}</a>";
} else {
$pageinfo .= "<a href=\"index.php?page={$i}\">{$i}</a>";
}
}
} else {
// (在此处添加页码大于7的代码)……
}

6)页码链接2:总页数大于7页、当前页小于等于5时,生成数字导航链接

if ($page <= 5) {
for ($i = 1; $i <= 7; $i++) {
if ($page == $i) {
$pageinfo .= "<a class=\"current\" href=\"index.php?page={$i}\">{$i}</a>";
} else {
$pageinfo .= "<a href=\"index.php?page={$i}\">{$i}</a>";
}
}
$pageinfo .= "<a href=\"javascript:return false;\" onclick=\"return false;\">...</a>";
} else {
// (在此处添加当前页大于5的代码)……
}

7)根据页码计算LIMIT参数:总页数大于7页,当前页大于5时,生成数字导航链接

$pageinfo .= "<a href=\"index.php?page=1\">1</a>";
$pageinfo .= "<a href=\"index.php?page=2\">2</a>";
$pageinfo .= "<a href=\"javascript:return false;\" onclick=\"return false;\">...</a>";
if ($page > $pages - 3) {
for ($i = $pages - 4; $i <= $pages; $i++) {
if($page == $i){
$pageinfo .= "<a class=\"current\" href=\"index.php?page={$i}\">{$i}</a>";
} else {
$pageinfo .= "<a href=\"index.php?page={$i}\">{$i}</a>";
}
}
} else {
…… (见下一页)
}

8)根据页码计算LIMIT参数:总页数大于7页,当前页大于5时,生成数字导航链接

for ($i = $page - 2; $i <= $page + 2; $i++) {
if ($page == $i) {
$pageinfo .= "<a class=\"current\" href=\"index.php?page={$i}\">{$i}</a>";
} else {
$pageinfo .= "<a href=\"index.php?page={$i}\">{$i}</a>";
}
}
$pageinfo .= "<a href=\"javascript:return false;\" onclick=\"return false;\">...</a>";

9)显示分页:在页面中显示分页内容

<div class="page">
<?php echo $pageinfo;?>
</div>

注意:封装的函数在这里

相关推荐

  • 生成图片

    from PIL import Image, ImageColor, ImageDraw, ImageFont, ImageFilterdef create_image_with_text(size, color, text, font_path, font_size, text_color, shadow_color, output_path): """ Create a new image of specified size and color with centered text that has a border and shadow. :param size: A tuple con

  • 获取指定目录下的所有图片信息

    1 获取指定目录下的所有图片信息// 获取指定目录下的所有图片信息 public function getImagesInfo($directory) { $images = []; // 创建递归目录迭代器 $iterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($directory, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY ); // 遍历目录中的每个文件 foreach (

  • Thinkphp各版本的PHP要求

    ThinkPHP 8.0:运行环境要求PHP8.0+,兼容PHP8.3ThinkPHP 6.1:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 6.0:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 5.1:运行环境要求PHP5.6+,兼容PHP8.0ThinkPHP 5.0:运行环境要求PHP5.4+,兼容PHP7.3