Blogger Information
Blog 63
fans 8
comment 8
visits 50343
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP大牛成长之路:PHP分页实战
周Sir-BLOG
Original
759 people have browsed it

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
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:看业是掌握分页了, 其实分页中的所有细节你都掌握了
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post