博客列表 >PHP实现分页

PHP实现分页

早晨
早晨原创
2022年08月21日 23:50:51630浏览

php分页操作演示

page.php代码

  1. <?php
  2. namespace _0819;
  3. use PDO;
  4. // 连接
  5. $db = new PDO('mysql:dbname=phpedu', 'root', 'root');
  6. // 1. 页数
  7. $page = $_GET['p'] ?? 1;
  8. echo '当前页数: p = ' . $page . '<br>';
  9. // 2. 数量
  10. $num = 5;
  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 `staff`';
  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 `staff`
  32. LIMIT $offset, $num;
  33. SQL;
  34. $stmt = $db->prepare($sql);
  35. $stmt->execute();
  36. $staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);
  37. echo '<hr>';
  38. /**
  39. * 生成分页码
  40. *
  41. * @param integer $page 当前页
  42. * @param integer $pages 总页数
  43. * @return array
  44. */
  45. // function createPages(int $page, int $pages): array
  46. // {
  47. // 当前是第8页, 共计20页
  48. // [1, ... 6, 7, 8, 9, 10, .... 20]
  49. // 当前是第10页, 共计20页
  50. // [1, ... 8, 9, 10, 11, 12, .... 20]
  51. // 1. 生成与总页数长度相同的递增的整数数组
  52. $pageArr = range(1, $pages);
  53. // 2. 只需要当前和前后二页, 其它页码用 false/null 来标记
  54. $paginate = array_map(function ($p) use ($page, $pages) {
  55. return ($p == 1 || $p == $pages || abs($page - $p) <= 2) ? $p : null;
  56. }, $pageArr);
  57. // dump($paginate);
  58. // 去重, 替换
  59. $before = array_unique(array_slice($paginate, 0, $page));
  60. $after = array_unique(array_slice($paginate, $page));
  61. // 用解构进行合并
  62. // return [...$before, ...$after];
  63. $page_ret = [...$before, ...$after];
  64. // }
  1. <?php
  2. require 'page.php';
  3. ?>
  4. <!DOCTYPE html>
  5. <html lang="zh-CN">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <title>PHP实现分页</title>
  11. </head>
  12. <style>
  13. table {
  14. width: 400px;
  15. border-collapse: collapse;
  16. text-align: center;
  17. }
  18. table th,
  19. table td {
  20. border: 1px solid;
  21. padding: 5px;
  22. }
  23. table thead {
  24. background-color: lightcyan;
  25. }
  26. table caption {
  27. font-size: larger;
  28. margin-bottom: 8px;
  29. }
  30. body>p {
  31. display: flex;
  32. }
  33. p>a {
  34. text-decoration: none;
  35. color: #555;
  36. border: 1px solid;
  37. padding: 5px 10px;
  38. margin: 10px 2px;
  39. }
  40. .active {
  41. background-color: seagreen;
  42. color: white;
  43. border: 1px solid seagreen;
  44. }
  45. </style>
  46. <body>
  47. <table>
  48. <caption>员工信息表</caption>
  49. <thead>
  50. <tr>
  51. <th>ID</th>
  52. <th>姓名</th>
  53. <th>性别</th>
  54. <th>邮箱</th>
  55. </tr>
  56. </thead>
  57. <tbody>
  58. <?php foreach ($staffs as $staff) : extract($staff) ?>
  59. <?php $sex = $sex ? '男' : '女';
  60. ?>
  61. <tr>
  62. <td><?= $id ?>
  63. </td>
  64. <td><?= $name ?>
  65. </td>
  66. <td><?= $sex ?>
  67. </td>
  68. <td><?= $email ?>
  69. </td>
  70. </tr>
  71. <?php endforeach ?>
  72. </tbody>
  73. </table>
  74. <p>
  75. <?php
  76. $a = $page - 1;
  77. if ($page <= 0) {
  78. echo "<script>alert('前面没有了');history.go(-1);</script>";
  79. $a = 1;
  80. }
  81. $dqpage = $_SERVER['PHP_SELF'] . '?p=' . $a;
  82. ?>
  83. <a href="<?= $dqpage ?>">上一页</a>
  84. <?php foreach ($page_ret as $k => $v) : ?>
  85. <?php
  86. // 页码跳转的url
  87. if ($v === null) {
  88. $v = '...';
  89. }
  90. if ($v === '...') {
  91. $url = '#';
  92. } else {
  93. $url = $_SERVER['PHP_SELF'] . '?p=' . $v;
  94. }
  95. // 实现页码高亮
  96. $page = $_GET['p'] ?? 1;
  97. $active = ($v == $page) ? 'active' : null;
  98. ?>
  99. <a href="<?= $url ?>" class="<?= $active ?>"><?= $v ?></a>
  100. <?php endforeach ?>
  101. <?php
  102. $b = $page + 1;
  103. if ($page > $pages) {
  104. echo "<script>alert('后面没有了');history.go(-1);</script>";
  105. $a = $pages;
  106. }
  107. $dqpage = $_SERVER['PHP_SELF'] . '?p=' . $b;
  108. ?>
  109. <a href="<?= $dqpage ?>">下一页</a>
  110. </p>
  111. </body>
  112. </html>

运行效果

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议