博客列表 >PHP实现分页功能/分页条的优化

PHP实现分页功能/分页条的优化

汇享科技
汇享科技原创
2022年08月20日 11:38:51417浏览

上一页下一页实现原理:

获取到当前页码 默认是-1或者+1 但是当达到最小值或者最大值的时候也就是1和最大页数的时候此时应该判断 当当前页码小于1的时候进行处理 不会进行查询 我是用js做了个弹出然后返回上一页就可以了 下一页同理


  • 演示效果

  • 代码部分

  1. <?php
  2. namespace _0819;
  3. use PDO;
  4. // 连接
  5. $db = new PDO('mysql:dbname=user', 'root', 'root');
  6. // 1. 页数
  7. $page = $_GET['p'] ?? 1;
  8. echo '当前页数: p = ' . $page . '<br>';
  9. // 2. 数量
  10. $num = 10;
  11. echo '当前数量: num = ' . $num . '<br>';
  12. // 3. 偏移量 = (页数 - 1) * 数量
  13. $offset = ($page - 1) * $num;
  14. echo '当前偏移量: offset = ' . $offset . '<br>';
  15. // 4. 计算总记录数
  16. // SELECT CEIL(COUNT(*)/5) AS `total` FROM `staff`
  17. // SELECT COUNT(*) AS `total` FROM `staff`
  18. $sql = 'SELECT COUNT(*) AS `total` FROM `user_list`';
  19. $stmt = $db->prepare($sql);
  20. $stmt->execute();
  21. // 将总数量绑定到一个变量上
  22. $stmt->bindColumn('total', $total);
  23. $stmt->fetch();
  24. echo '当前总记录数量: total = ' . $total . '<br>';
  25. // 5. 计算总页数
  26. // 向上取整
  27. $pages = ceil($total / $num);
  28. echo '当前总页数: pages = ' . $pages . '<br>';
  29. $sql = <<< SQL
  30. SELECT *
  31. FROM `user_list`
  32. LIMIT $offset, $num;
  33. SQL;
  34. $stmt = $db->prepare($sql);
  35. $stmt->execute();
  36. $staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);
  37. // print_r($staffs);
  38. echo '<hr>';
  39. if (count($staffs) === 0) {
  40. echo '查询结果为空';
  41. } else {
  42. foreach ($staffs as $staff) {
  43. extract($staff); // $id,$name,$sex,$email
  44. printf('%d-%s-%s-%d<br>', $id, $name, $email, $age);
  45. }
  46. }
  47. echo '<hr>';
  48. // 1. 生成与总页数长度相同的递增的整数数组
  49. // range():创建一个指定范围的数组 这行代码的意思是值从1开始创建范围是截止到当前总页数的数组
  50. // 结果也就是Array ( [0] => 1 [1] => 2 [2] => 3 [3]=>4 ......以此类推)
  51. // 创建这个新数组的目的是将所有页数整合到一个大数组中然后在进行操作
  52. $pageArr = range(1, $pages);
  53. /**
  54. * 2. 只需要当前和前后二页, 其它页码用 false/null 来标记
  55. *
  56. *array_map():返回一个满足条件的新数组
  57. *abs():返回指定参数的绝对值
  58. *返回结果$p == 1 || $p == $pages || abs($page - $p) <= 2) ? $p : null;的意思是
  59. *$p = 循环遍历的$pageArr的每个值
  60. * 条件:当前页数 = 1 和 当前页数等于总页数也就是最后一页 和 当前页数 - $p的绝对值如果小于等于2的时候返回当前页码 否则就为null
  61. *
  62. */
  63. $paginate = array_map(function ($p) use ($page, $pages) {
  64. return ($p == 1 || $p == $pages || abs($page - $p) <= 2) ? $p : null;
  65. }, $pageArr);
  66. // 去重, 替换
  67. // array_unique:将数组中重复的内容删除只保留一个 array_slice:截取$paginate数组中的数据 从0第一个元素开始往后取 取到当前页码位置
  68. $before = array_unique(array_slice($paginate, 0, $page));
  69. //从当前页码位置往后取全部
  70. $after = array_unique(array_slice($paginate, $page));
  71. // 用解构进行合并
  72. // 将以上两个数组解构之后进行合并成一个数组
  73. $res = [...$before, ...$after];
  1. <style>
  2. table {
  3. width: 400px;
  4. border-collapse: collapse;
  5. text-align: center;
  6. }
  7. table th,
  8. table td {
  9. border: 1px solid;
  10. padding: 5px;
  11. }
  12. table thead {
  13. background-color: lightcyan;
  14. }
  15. table caption {
  16. font-size: larger;
  17. margin-bottom: 8px;
  18. }
  19. body>p {
  20. display: flex;
  21. }
  22. p>a {
  23. text-decoration: none;
  24. color: #555;
  25. border: 1px solid;
  26. padding: 5px 10px;
  27. margin: 10px 2px;
  28. }
  29. .active {
  30. background-color: seagreen;
  31. color: white;
  32. border: 1px solid seagreen;
  33. }
  34. </style>
  35. </head>
  36. <body>
  37. <table>
  38. <caption>员工信息表</caption>
  39. <thead>
  40. <tr>
  41. <th>ID</th>
  42. <th>姓名</th>
  43. <th>年龄</th>
  44. <th>邮箱</th>
  45. </tr>
  46. </thead>
  47. <tbody>
  48. <?php foreach ($staffs as $staff) : extract($staff) ?>
  49. <tr>
  50. <td><?= $id ?>
  51. </td>
  52. <td><?= $name ?>
  53. </td>
  54. <td><?= $age ?>
  55. </td>
  56. <td><?= $email ?>
  57. </td>
  58. </tr>
  59. <?php endforeach ?>
  60. </tbody>
  61. </table>
  62. <p>
  63. <?php
  64. $a = $page - 1;
  65. // echo gettype($a);
  66. // var_dump($a < 0);
  67. if ($page <= 0) {
  68. echo "<script>alert('前面没有了');history.go(-1);</script>";
  69. $a = 1;
  70. // header("Location:?p=1");
  71. }
  72. $dqpage = $_SERVER['PHP_SELF'] . '?p=' . $a;
  73. ?>
  74. <a href="<?= $dqpage ?>">上一页</a>
  75. <?php foreach ($res as $k => $v) : ?>
  76. <?php
  77. // 页码跳转的url
  78. if ($v === null) {
  79. $v = '...';
  80. }
  81. if ($v === '...') {
  82. // echo '1';
  83. $url = '#';
  84. } else {
  85. $url = $_SERVER['PHP_SELF'] . '?p=' . $v;
  86. }
  87. // $a = ($v = '...' ? null : $_SERVER['PHP_SELF'] . '?p=' . $v);
  88. // echo $a;
  89. // 实现页码高亮
  90. $page = $_GET['p'] ?? 1;
  91. $active = ($v == $page) ? 'active' : null;
  92. ?>
  93. <a href="<?= $url ?>" class="<?= $active ?>"><?= $v ?></a>
  94. <?php endforeach ?>
  95. <?php
  96. $b = $page + 1;
  97. // echo gettype($a);
  98. // var_dump($a < 0);
  99. if ($page > $pages) {
  100. echo "<script>alert('后面没有了');history.go(-1);</script>";
  101. $a = $pages;
  102. // header("Location:?p=1");
  103. }
  104. $dqpage = $_SERVER['PHP_SELF'] . '?p=' . $b;
  105. ?>
  106. <a href="<?= $dqpage ?>">下一页</a>
  107. </p>
  108. </body>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议