博客列表 >PHP大牛成长之路:PHP分页实战

PHP大牛成长之路:PHP分页实战

周Sir-BLOG
周Sir-BLOG原创
2020年08月04日 23:36:31753浏览

1、PHP分页实战

  • 实战分为5个文件演示:
No 文件名称 备注
1 config.php 连接数据+分页变量+分页函数
2 edit.php 更新表单
3 handle.php 控制删除/更新操作
4 list.php 分页列表
5 sytle.css 简单样式表

1.1 config.php

  1. // PDO连接数据库
  2. $pdo = new PDO('mysql:host=localhost;dbname=php_pro', 'root', 'root');
  3. // 设置结果默认获取方式: 关联数组
  4. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  5. // 获取分页数据, 一定要知道的二个数据
  6. // 1. 每页显示的数量
  7. $num = 15;
  8. // 2. 当前页码,默认为1
  9. $page = $_GET['p'] ?? 1;
  10. // 3. 计算每一页的第一条记录的显示偏移量
  11. $offset = ($page - 1) * $num;
  12. // 定义查询条件
  13. $where='`id` >= 1';
  14. // 4. 获取分页数据
  15. // SElECT * FROM `table_name `LIMIT n OFFSET m;
  16. $sql = "SELECT * FROM `users` WHERE $where LIMIT {$num} OFFSET {$offset}";
  17. // 简写
  18. // $sql = "SELECT * FROM `users` LIMIT {$offset}, {$num}";
  19. $users = $pdo->query($sql)->fetchAll();
  20. // print_r($users);
  21. // 计算总页数
  22. // 计算表中共计有多少条记录?
  23. // 每一页显示几条? 5
  24. // 总页数 = ceil(记录总数 / 每页的记录数)
  25. $sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `users` WHERE $where";
  26. // 计算总页数
  27. $pages = $pdo->query($sql)->fetch()['total'];
  28. function showPage($pages,$page){
  29. $prev = ($page == 1) ? 1 : $page - 1;
  30. $next = (($page + 1)>= $pages) ? $pages : $page + 1;
  31. if($pages<10){
  32. //总页码小于10页(上一页 1 2 3 4 5 6 7 8 9 下一页)
  33. $show_page = "<a href='?p={$prev}'>上一页</a>";
  34. for ($i= 1; $i <= $pages; $i++) {
  35. $active = ($i == $page) ? 'active' : null;
  36. if($i<=$pages){
  37. $show_page.="<a href='?p=$i' class='$active'>$i</a>";
  38. }
  39. }
  40. $show_page.="<a href='?p=$next'>下一页</a>";
  41. echo $show_page;
  42. }elseif($page <= 6){
  43. //当前页码小于等于8页 (上一页 1 2 3 4 5 6 7 8 ... 9 10 下一页)
  44. $show_page = "<a href='?p={$prev}'>上一页</a>";
  45. for ($i= 1; $i <= 8; $i++) {
  46. $active = ($i == $page) ? 'active' : null;
  47. if($i<=$pages){
  48. $show_page.="<a href='?p=$i' class='$active'>$i</a>";
  49. }
  50. }
  51. $show_page.="<a href='javascript:;'>...</a>";
  52. $a=$pages-1;
  53. $show_page.="<a href='?p=$a'>$a</a>";
  54. $show_page.="<a href='?p=$pages'>$pages</a>";
  55. $show_page.="<a href='?p=$next'>下一页</a>";
  56. echo $show_page;
  57. }elseif($page<=$pages-6){
  58. //当前页码小于等于(总页数-6)(上一页 1 2 ... 7 8 9 10 11 ... 99 100 下一页)
  59. $show_page = "<a href='?p={$prev}'>上一页</a>";
  60. $show_page.="<a href='?p=1'>1</a>";
  61. $show_page.="<a href='?p=2'>2</a>";
  62. $show_page.="<a href='javascript:;'>...</a>";
  63. for ($i= $page-2; $i < $page+3; $i++) {
  64. $active = ($i == $page) ? 'active' : null;
  65. if($i<=$pages){
  66. $show_page.="<a href='?p=$i' class='$active'>$i</a>";
  67. }
  68. }
  69. $show_page.="<a href='javascript:;'>...</a>";
  70. $a=$pages-1;
  71. $show_page.="<a href='?p=$a'>$a</a>";
  72. $show_page.="<a href='?p=$pages'>$pages</a>";
  73. $show_page.="<a href='?p=$next'>下一页</a>";
  74. echo $show_page;
  75. }else{
  76. //当前页码>$pages-6 (上一页 1 2 ... 94 95 96 97 98 99 100 下一页)
  77. $show_page = "<a href='?p={$prev}'>上一页</a>";
  78. $show_page.="<a href='?p=1'>1</a>";
  79. $show_page.="<a href='?p=2'>2</a>";
  80. $show_page.="<a href='javascript:;'>...</a>";
  81. for ($i= $pages-7; $i <= $pages; $i++) {
  82. $active = ($i == $page) ? 'active' : null;
  83. if($i<=$pages){
  84. $show_page.="<a href='?p=$i' class='$active'>$i</a>";
  85. }
  86. }
  87. $show_page.="<a href='?p=$next'>下一页</a>";
  88. echo $show_page;
  89. }
  90. }

1.2 eidt.php

  1. <?php
  2. // 获取要被编辑的数据
  3. $user = $pdo->query("SELECT * FROM `users` WHERE `id`={$id}")->fetch();
  4. // print_r($user);
  5. ?>
  6. <!DOCTYPE html>
  7. <html lang="en">
  8. <head>
  9. <meta charset="UTF-8">
  10. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  11. <title>用户编辑</title>
  12. </head>
  13. <body>
  14. <h3>用户编辑</h3>
  15. <form action="<? echo $_SERVER['PHP_SELF']. '?action=doedit&id='.$id?>" method="POST">
  16. <p>
  17. <label for="username">用户名:</label>
  18. <input type="text" name="username" id="username" value="<?=$user['username']?>">
  19. </p>
  20. <p>
  21. <label for="email">邮箱:</label>
  22. <input type="email" name="email" id="email" value="<?=$user['email']?>">
  23. </p>
  24. <p>
  25. <button>保存</button>
  26. </p>
  27. </form>
  28. </body>
  29. </html>

1.3 handle.php

  1. require 'config.php';
  2. // 获取操作
  3. $action = $_GET['action'];
  4. $page = $_GET['p'] ?? null;
  5. $id = $_GET['id'];
  6. switch ($action) {
  7. // 编辑操作: 1: 渲染编辑表单; 2. 执行编辑操作
  8. // 1: 渲染编辑表单
  9. case 'edit':
  10. // 加载,渲染数据编辑表单
  11. include 'edit.php';
  12. break;
  13. // 2. 执行编辑操作
  14. case 'doedit':
  15. // 更新
  16. $sql = 'UPDATE `users` SET `username`=?, `email`=? WHERE `id`=?';
  17. $stmt = $pdo->prepare($sql);
  18. // 新的数据在$_POST
  19. if (!empty($_POST)) {
  20. $stmt->execute([$_POST['username'], $_POST['email'], $id]);
  21. if ($stmt->rowCount() == 1) echo '<script>alert("更新成功");location.href="list.php"</script>';
  22. }
  23. break;
  24. // 删除
  25. case 'delete':
  26. $sql = 'DELETE FROM `users` WHERE `id`=?';
  27. $stmt = $pdo->prepare($sql);
  28. $stmt->execute([$id]);
  29. if ($stmt->rowCount() == 1) echo '<script>alert("删除成功");location.href="list.php"</script>';
  30. }

1.4 list.php

  1. <?php require 'config.php' ?>
  2. <!DOCTYPE html>
  3. <html lang="zh-cn">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>数据展示</title>
  8. <link rel="stylesheet" href="style.css">
  9. </head>
  10. <body>
  11. <table>
  12. <caption>用户信息表</caption>
  13. <thead>
  14. <tr>
  15. <td>id</td>
  16. <td>name</td>
  17. <td>email</td>
  18. <td>操作</td>
  19. </tr>
  20. </thead>
  21. <tbody>
  22. <?php foreach ($users as $user):?>
  23. <tr>
  24. <!-- 短标签来简化变量的显示 -->
  25. <td><?=$user['id']?></td>
  26. <td><?php echo $user['username'] ?></td>
  27. <td><?=$user['email']?></td>
  28. <td>
  29. <button onclick="location.href='handle.php?action=edit&id=<?=$user['id']?>'">编辑</button>
  30. <button onclick="del(<?=$user['id']?>)">删除</button></td>
  31. </tr>
  32. <?php endforeach ?>
  33. </tbody>
  34. </table>
  35. <!-- 显示分页 -->
  36. <p><?php showPage($pages,$page)?></p>
  37. <script>
  38. // 删除
  39. function del(id) {
  40. if(confirm('是否要删除ID为('+ id +')的数据?')){
  41. location.href='handle.php?action=delete&id='+id;
  42. }
  43. }
  44. </script>
  45. </body>
  46. </html>

1.5 style.css

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. color: #555;
  6. }
  7. body {
  8. display: flex;
  9. flex-direction: column;
  10. align-items: center;
  11. }
  12. /*表格样式*/
  13. table {
  14. width: 80%;
  15. border: 1px solid;
  16. border-collapse: collapse;
  17. text-align: center;
  18. }
  19. table caption {
  20. font-size: 1.2rem;
  21. margin: 10px;
  22. }
  23. table td,
  24. table th {
  25. border: 1px solid;
  26. padding: 5px;
  27. }
  28. table tr:hover {
  29. background-color: #eee;
  30. }
  31. table thead tr:only-of-type {
  32. background-color: lightblue;
  33. }
  34. table button {
  35. width: 56px;
  36. height: 26px;
  37. }
  38. table button:last-of-type {
  39. color: red;
  40. }
  41. table button {
  42. cursor: pointer;
  43. margin: 0 3px;
  44. }
  45. /*分页条样式*/
  46. body > p {
  47. display: flex;
  48. }
  49. p > a {
  50. text-decoration: none;
  51. color: #555;
  52. border: 1px solid;
  53. padding: 5px 10px;
  54. margin: 10px 2px;
  55. }
  56. .active {
  57. background-color: red;
  58. color: white;
  59. border: 1px solid red;
  60. }
  • 小于10页演示:

  • 大于10页演示:

  • 编辑演示:

  • 编辑演示:

总结

  • 把分页样式封装成分页函数,列表页调用;
  • 也实现了防PHP中文网分页功能,但方法有很多,我的思路不知道有没有BUG;
  • 记录一下朱老师分页讲解原理,感觉讲的特别到位:

分页原理

1. 术语

  1. 记录索引: 记录在表中的位置,从 0 开始编号(与主键的值无关)
  2. 偏移量: 每页显示的索引距离起始索引 0 的相对位置
  3. 显示数量: 每页的显示记录的条数
  1. SELECT * FROM `users` 每页的数量 显示的偏移量
  2. -- 每页的数量: LIMIT n
  3. -- 显示的偏移量: 从哪个索引开始显示 OFFSET m
  4. # 从第1页开始显示5条
  5. SELECT * FROM `users` LIMIT 5 OFFSET 0;
  6. -- (1-1)*5 = 0
  7. # 第二页,从索引5开始显示
  8. SELECT * FROM `users` LIMIT 5 OFFSET 5;
  9. -- (2-1)*5 = 5
  10. # 第3页,从索引10开始,即偏移量为10, 偏移量从第一条记录的索引开始计数
  11. SELECT * FROM `users` LIMIT 5 OFFSET 10;
  12. -- (3-1)*5 = 10
  • 分页的时候,一定会提供当前的页数,还有就是每一页的显示的记录数量
  • 而偏移量是动态变量的变量,随页数不同而发生变化

2. 计算偏移量

  • 偏移量 = (页码 -1) * 每页的显示数量
  • offset = (page - 1) * num
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议