博客列表 >PHP大牛成长之路:Ajax-post无刷新分页

PHP大牛成长之路:Ajax-post无刷新分页

周Sir-BLOG
周Sir-BLOG原创
2020年08月23日 09:47:21683浏览

Ajax-post无刷新分页

  • 前端 demo.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Ajax-post无刷新分页技术</title>
  7. <style>
  8. table {
  9. border-collapse: collapse;
  10. border: 1px solid;
  11. text-align: center;
  12. margin: auto;
  13. width: 500px;
  14. }
  15. table caption {
  16. font-size: 1.2rem;
  17. margin-bottom: 10px;
  18. }
  19. th,
  20. td {
  21. border: 1px solid;
  22. padding: 5px;
  23. }
  24. thead tr:first-of-type {
  25. background-color: #ddd;
  26. }
  27. p {
  28. text-align: center;
  29. }
  30. p a {
  31. text-decoration: none;
  32. border: 1px solid;
  33. padding: 0 8px;
  34. }
  35. .active {
  36. background-color: #f00;
  37. }
  38. </style>
  39. </head>
  40. <body>
  41. <table>
  42. <caption>
  43. 用户信息表
  44. </caption>
  45. <thead>
  46. <tr>
  47. <th>id</th>
  48. <th>username</th>
  49. <th>age</th>
  50. <th>email</th>
  51. </tr>
  52. </thead>
  53. <tbody></tbody>
  54. </table>
  55. <!-- 分页条 -->
  56. <p></p>
  57. <script src="../0818/jquery-3.5.1.js"></script>
  58. <script>
  59. // 默认是第一页
  60. var page = 1;
  61. // 默认显示的是第一页
  62. getPageData(page);
  63. // 获取分页数据的函数
  64. function getPageData(page) {
  65. $.ajax({
  66. type: "post",
  67. url: "page_data.php",
  68. data: { page: page },
  69. dataType: "json",
  70. success: show,
  71. });
  72. }
  73. // show()显示数据
  74. function show(data) {
  75. console.log(data);
  76. // 将json中的数据解析出来填充到表格中
  77. console.log(data.users);
  78. // 1. 将当前面的数据渲染出来
  79. var str = "";
  80. data.users.forEach(function (user) {
  81. str += "<tr>";
  82. str += "<td>" + user.id + "</td>";
  83. str += "<td>" + user.username + "</td>";
  84. str += "<td>" + user.age + "</td>";
  85. str += "<td>" + user.email + "</td>";
  86. str += "</tr>";
  87. });
  88. $("tbody").html(str);
  89. // 2. 将分页条显示出来
  90. var str = "";
  91. for (var i = 1; i <= data.num; i++) {
  92. str += '<a href="" data-index=' + i + ">" + i + "</a>";
  93. }
  94. // $("p").html(str).find("a").first().addClass("active");
  95. $("p").html(str).find("a").eq(page-1).addClass("active");
  96. // 3. 添加分页点击事件
  97. $("p a").click(function (ev) {
  98. ev.preventDefault();
  99. // 获取当前要显示的新页面,根据自定义属性
  100. page = $(this).attr("data-index");
  101. // $("tbody").html(""); //先清空在赋值会闪一下,没必要(因为显示分页str会重新初始化)
  102. getPageData(page);
  103. });
  104. }
  105. </script>
  106. </body>
  107. </html>
  • 后端 page_data.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 = 10;
  8. // 2. 当前页码,默认为1
  9. $page = $_POST['page'] ?? 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. // 计算总页数
  21. // 计算表中共计有多少条记录?
  22. // 每一页显示几条?
  23. // 总页数 = ceil(记录总数 / 每页的记录数)
  24. // CEIL:向上取整(分页最后还有一条也要显示)
  25. $sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `users` WHERE $where";
  26. // 计算总页数
  27. $pages = $pdo->query($sql)->fetch()['total'];
  28. // ajax分页数据一定是返回二部分
  29. // 1. 总页数, 提供给前端自动生成分页条
  30. // 2. 分页数据
  31. echo json_encode(['pages' => $pages, 'num' => $num,'users' => $users]);
  32. die;
  • 最终效果

如需参考的同学请自行加载你的jQuery文件

总结

  • 分页数据演示使用原有数据库,未使用老师给的,主要以实现功能为主;
  • 这个案例老师故意埋了两个坑,第一个:分页展示循环是以总页数数循环,当你100页的时候会全部显示出来;第二个,点击事件老师故意把page变量再次初始化,让很多同学琢磨半天没能脱坑;(好在我用console.log输出第一眼就发现了,没上当。。。偷笑中。。)
  • 实际这个案例属于半成品,分页显示大于10页的我都没做,因为我觉得这不是难点,就是把前期的分页案例后端的逻辑转为前端实现就可以了。(我需要对自己的短板进行充电,这一块后期线下练习)
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议