博客列表 >服务端 - PHP - 分页

服务端 - PHP - 分页

郴
原创
2020年05月26日 09:38:34781浏览

服务端 - PHP - 分页

一、原理

  • 分页技术核心在于确定当前的页数,然后利用 SQL查询中 的 LIMIT 关键字来指定输出对应的记录数
    1. 首先确定每页要输出多少条记录,假定是输出10条
    1. 得出每一页的索引范围(结果数组中的索引范围):假如当前是第1页,那么就是0,9(LIMIT 0,10、LIMIT 10 OFFSET 0);第2页是10,19(LIMIT 10,10、LIMIT 10 OFFSET 10);第3页是20,29(LIMIT 20,10、LIMIT 10 OFFSET 20),以此类推
    1. 得出计算每一页的偏移量(起始索引)的公式:(当前页 - 1) * 每页显示的记录数

三、实现

1. 简单分页

  • index.php
  1. <?php require 'handle2.php'; ?>
  2. <!DOCTYPE html>
  3. <html lang="zh_hans">
  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="css/index1.css">
  9. </head>
  10. <body>
  11. <table>
  12. <caption>用户信息表</caption>
  13. <thead>
  14. <tr>
  15. <th>ID</th>
  16. <th>用户名</th>
  17. <th>性别</th>
  18. <th>Email</th>
  19. <th>注册时间</th>
  20. <th>操作</th>
  21. </tr>
  22. </thead>
  23. <tbody>
  24. <!--遍历并渲染数据-->
  25. <?php foreach ($staffs as $staff): ?>
  26. <tr>
  27. <td><?php echo $staff['id'] ?></td>
  28. <td><?php echo $staff['user_name'] ?></td>
  29. <td><?php echo $staff['sex'] ?></td>
  30. <td><?php echo $staff['email'] ?></td>
  31. <td><?php echo date('Y-m-d', $staff['reg_time']) ?></td>
  32. <td><button>编辑</button><button>删除</button></td>
  33. </tr>
  34. <?php endforeach ?>
  35. </tbody>
  36. </table>
  37. <!--根据总页数渲染分页条数据-->
  38. <p>
  39. <?php for ($i=1; $i<=$pages; $i++): ?>
  40. <?php
  41. $jump = sprintf('%s?p=%s', $_SERVER['PHP_SELF'], $i);
  42. $active = ($i == $page) ? 'active' : null;
  43. ?>
  44. <!--jump为跳转按钮,用来设置当前页-->
  45. <!--active用来设置类名应用样式-->
  46. <!--i用来设置页码名称-->
  47. <a href="<?php echo $jump ?>" class="<?php echo $active ?>"><?php echo $i ?></a>
  48. <?php endfor ?>
  49. </p>
  50. </body>
  51. </html>
  • handle2.php
  1. <?php
  2. //连接数据库
  3. $pdo = new PDO('mysql:host=localhost;dbname=shopping', 'root', 'root');
  4. //1. 定义每页显示的记录数
  5. $n = 10;
  6. //2. 获取总页数
  7. $sql = "SELECT CEIL(COUNT(`id`)/{$n}) AS `total` FROM `userinfo`";
  8. $pages = $pdo->query($sql)->fetch()['total'];
  9. //3. 定义当前的页码,默认值是1
  10. $page = $_GET['p'] ?? 1;
  11. //4. 获取偏移量
  12. $p_start = $n * ($page - 1);
  13. //5. 获取分页数据
  14. $sql = "SELECT * FROM `userinfo` LIMIT {$n} OFFSET {$p_start}";
  15. $staffs = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);

2. 带有跳转到首页, 前一页, 下一页, 尾页的功能

  1. <p>
  2. <!--首页-->
  3. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=1' ?>">首页</a>
  4. <!--前一页-->
  5. <?php
  6. //前一页=当前页-1
  7. $prev = $page - 1;
  8. //如果当前页等于1,那么前一页也等于1,防止出现负页数
  9. if ($page == 1) $prev = 1;
  10. ?>
  11. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $prev ?>">向上</a>
  12. <!--根据总页数渲染分页条数据-->
  13. <?php for ($i=1; $i<=$pages; $i++): ?>
  14. <?php
  15. $jump = sprintf('%s?p=%s', $_SERVER['PHP_SELF'], $i);
  16. $active = ($i == $page) ? 'active' : null;
  17. ?>
  18. <!--jump为跳转按钮,用来设置当前页-->
  19. <!--active用来设置类名应用样式-->
  20. <!--i用来设置页码名称-->
  21. <a href="<?php echo $jump ?>" class="<?php echo $active ?>"><?php echo $i ?></a>
  22. <?php endfor ?>
  23. <!--下一页-->
  24. <?php
  25. //下一页=当前页+1
  26. $next = $page + 1;
  27. //如果当前页等于总页数,那么下一页等于总页数,防止出现无线递增的页数
  28. if ($page == $pages) $next = $pages;
  29. ?>
  30. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $next ?>">向下</a>
  31. <!--尾页-->
  32. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $pages ?>">尾页</a>
  33. </p>

3. 带有页码省略功能(自定义偏移量,不需要计算公式)

  • 分页技术核心在于在确定分页条的偏移量情况下,如何计算起始页及终止页,以及如何解决自定义分页条页码数大于总页数时页码无限递增的bug
  1. <p>
  2. <!--页码省略功能-->
  3. <?php
  4. //自定义分页条页码数
  5. $show_pages = 7;
  6. //自定义分页条偏移量
  7. $offset_page = 3;
  8. //分页条起始页
  9. $start_page = 1;
  10. //分页条终止页
  11. $end_page = $pages;
  12. // 只有当前分页条数量 < 总页数, 才有必要显示出省略标记
  13. if ($start_page < $pages) {
  14. //1. 如果当前页大于偏移量+1,则在起始显示...
  15. if ($page > ($offset_page + 1)) $start_omit = '...';
  16. //2. 重置分页条页码
  17. if ($page > $offset_page) {
  18. //起始页=当前页-偏移量
  19. $start_page = $page - $offset_page;
  20. //终止页=当前页+偏移量
  21. $end_page = $page + $offset_page;
  22. } else {
  23. //默认起始页是1,终止页等于自定义分页条页码数
  24. $start_page = 1;
  25. $end_page = $show_pages;
  26. }
  27. //3. 当当前页+偏移量大于总页数时终止页等于总页数,防止出现自定义分页条页码数大于总页数时页码无限递增的bug
  28. if ($page + $offset_page > $pages) {
  29. $end_page = $pages;
  30. }
  31. //4. 如果当前页大于偏移量+1和当前页加偏移量小于总页数,则在末尾显示...
  32. if ($page > ($offset_page + 1) && $show_pages < $pages && $page + $offset_page < $pages) $end_omit = '...';
  33. }
  34. ?>
  35. <!--首页-->
  36. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=1' ?>">首页</a>
  37. <!--前一页-->
  38. <?php
  39. //前一页=当前页-1
  40. $prev = $page - 1;
  41. //如果当前页等于1,那么前一页也等于1,防止出现负页数
  42. if ($page == 1) $prev = 1;
  43. ?>
  44. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $prev ?>">向上</a>
  45. <!--前置省略号-->
  46. <?php if (isset($start_omit)): ?><a href="#"><?php echo $start_omit ?></a><?php endif ?>
  47. <!--根据总页数渲染分页条数据-->
  48. <!--将起始页和总页码置换-->
  49. <?php for ($i=$start_page; $i<=$end_page; $i++): ?>
  50. <?php
  51. $jump = sprintf('%s?p=%s', $_SERVER['PHP_SELF'], $i);
  52. $active = ($i == $page) ? 'active' : null;
  53. ?>
  54. <!--jump为跳转按钮,用来设置当前页-->
  55. <!--active用来设置类名应用样式-->
  56. <!--i用来设置页码名称-->
  57. <a href="<?php echo $jump ?>" class="<?php echo $active ?>"><?php echo $i ?></a>
  58. <?php endfor ?>
  59. <!--后置省略号-->
  60. <?php if (isset($end_omit)): ?><a href="#"><?php echo $end_omit ?></a><?php endif ?>
  61. <!--下一页-->
  62. <?php
  63. //下一页=当前页+1
  64. $next = $page + 1;
  65. //如果当前页等于总页数,那么下一页等于总页数,防止出现无线递增的页数
  66. if ($page == $pages) $next = $pages;
  67. ?>
  68. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $next ?>">向下</a>
  69. <!--尾页-->
  70. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $pages ?>">尾页</a>
  71. </p>




4. 带有显示起始和末尾页码功能

  1. <p>
  2. <!--页码省略功能-->
  3. <?php
  4. //自定义分页条页码数
  5. $show_pages = 5;
  6. //自定义分页条偏移量
  7. $offset_page = 2;
  8. //分页条起始页
  9. $start_page = 1;
  10. //分页条终止页
  11. $end_page = $pages;
  12. //倒数第二页
  13. $n = $pages - 1;
  14. // 只有当前分页条数量 < 总页数, 才有必要显示出省略标记
  15. if ($start_page < $pages) {
  16. //1. 如果当前页大于偏移量+1,则在起始显示...
  17. if ($page > ($offset_page + 1)) {
  18. $start_omit = '...';
  19. }
  20. //2. 重置分页条页码
  21. if ($page > $offset_page) {
  22. //起始页=当前页-偏移量
  23. $start_page = $page - $offset_page;
  24. //终止页=当前页+偏移量
  25. $end_page = $page + $offset_page;
  26. } else {
  27. //默认起始页是1,终止页等于自定义分页条页码数
  28. $start_page = 1;
  29. $end_page = $show_pages;
  30. }
  31. //3. 当当前页+偏移量大于总页数时终止页等于总页数,防止出现自定义分页条页码数大于总页数时页码无限递增的bug
  32. if ($page + $offset_page > $pages) {
  33. $end_page = $pages;
  34. }
  35. //4. 如果当前页大于偏移量+1和当前页加偏移量小于总页数,则在末尾显示...
  36. if ($page > ($offset_page + 1) && $show_pages < $pages && $page + $offset_page < $pages) $end_omit = '...';
  37. }
  38. ?>
  39. <!--首页-->
  40. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=1' ?>">首页</a>
  41. <!--前一页-->
  42. <?php
  43. //前一页=当前页-1
  44. $prev = $page - 1;
  45. //如果当前页等于1,那么前一页也等于1,防止出现负页数
  46. if ($page == 1) $prev = 1;
  47. ?>
  48. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $prev ?>">向上</a>
  49. <!--前二页-->
  50. <?php if ($page > ($offset_page + 1)): ?>
  51. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=1' ?>">1</a>
  52. <?php endif ?>
  53. <?php if ($page > ($offset_page + 2)): ?>
  54. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=2' ?>">2</a>
  55. <?php endif ?>
  56. <!--前置省略号-->
  57. <?php if (isset($start_omit)): ?><a href="#"><?php echo $start_omit ?></a><?php endif ?>
  58. <!--根据总页数渲染分页条数据-->
  59. <!--将起始页和总页码置换-->
  60. <?php for ($i=$start_page; $i<=$end_page; $i++): ?>
  61. <?php
  62. $jump = sprintf('%s?p=%s', $_SERVER['PHP_SELF'], $i);
  63. $active = ($i == $page) ? 'active' : null;
  64. ?>
  65. <!--jump为跳转按钮,用来设置当前页-->
  66. <!--active用来设置类名应用样式-->
  67. <!--i用来设置页码名称-->
  68. <a href="<?php echo $jump ?>" class="<?php echo $active ?>"><?php echo $i ?></a>
  69. <?php endfor ?>
  70. <!--后置省略号-->
  71. <?php if (isset($end_omit)): ?><a href="#"><?php echo $end_omit ?></a><?php endif ?>
  72. <!--后二页-->
  73. <?php if ($page > ($offset_page + 2) && ($page + $offset_page) < $n): ?>
  74. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $n ?>"><?php echo $n ?></a>
  75. <?php endif ?>
  76. <?php if ($page > ($offset_page + 1) && ($page + $offset_page) < $pages): ?>
  77. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $pages ?>"><?php echo $pages ?></a>
  78. <?php endif ?>
  79. <!--下一页-->
  80. <?php
  81. //下一页=当前页+1
  82. $next = $page + 1;
  83. //如果当前页等于总页数,那么下一页等于总页数,防止出现无线递增的页数
  84. if ($page == $pages) $next = $pages;
  85. ?>
  86. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $next ?>">向下</a>
  87. <!--尾页-->
  88. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $pages ?>">尾页</a>
  89. </p>




5. 带有记录的编辑和删除功能

  • index.php
  1. <?php require 'handle2.php'; ?>
  2. <!DOCTYPE html>
  3. <html lang="zh_hans">
  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="css/index1.css">
  9. </head>
  10. <body>
  11. <table>
  12. <caption>用户信息表</caption>
  13. <thead>
  14. <tr>
  15. <th>ID</th>
  16. <th>用户名</th>
  17. <th>性别</th>
  18. <th>Email</th>
  19. <th>注册时间</th>
  20. <th>操作</th>
  21. </tr>
  22. </thead>
  23. <tbody>
  24. <!--遍历并渲染数据-->
  25. <?php foreach ($staffs as $staff): ?>
  26. <tr>
  27. <td><?php echo $staff['id'] ?></td>
  28. <td><?php echo $staff['user_name'] ?></td>
  29. <td><?php echo $staff['sex'] ?></td>
  30. <td><?php echo $staff['email'] ?></td>
  31. <td><?php echo date('Y-m-d', $staff['reg_time']) ?></td>
  32. <td><button onclick="location.href='handle3.php?action=edit&id=<?php echo $staff['id']?>'">编辑</button>
  33. <button onclick="del(<?php echo $staff['id']?>)">删除</button></td>
  34. </tr>
  35. <?php endforeach ?>
  36. </tbody>
  37. </table>
  38. <p>
  39. <!--页码省略功能-->
  40. <?php
  41. //自定义分页条页码数
  42. $show_pages = 5;
  43. //自定义分页条偏移量
  44. $offset_page = 2;
  45. //分页条起始页
  46. $start_page = 1;
  47. //分页条终止页
  48. $end_page = $pages;
  49. //倒数第二页
  50. $n = $pages - 1;
  51. // 只有当前分页条数量 < 总页数, 才有必要显示出省略标记
  52. if ($start_page < $pages) {
  53. //1. 如果当前页大于偏移量+1,则在起始显示...
  54. if ($page > ($offset_page + 1)) {
  55. $start_omit = '...';
  56. }
  57. //2. 重置分页条页码
  58. if ($page > $offset_page) {
  59. //起始页=当前页-偏移量
  60. $start_page = $page - $offset_page;
  61. //终止页=当前页+偏移量
  62. $end_page = $page + $offset_page;
  63. } else {
  64. //默认起始页是1,终止页等于自定义分页条页码数
  65. $start_page = 1;
  66. $end_page = $show_pages;
  67. }
  68. //3. 当当前页+偏移量大于总页数时终止页等于总页数,防止出现自定义分页条页码数大于总页数时页码无限递增的bug
  69. if ($page + $offset_page > $pages) {
  70. $end_page = $pages;
  71. }
  72. //4. 如果当前页大于偏移量+1和当前页加偏移量小于总页数,则在末尾显示...
  73. if ($page > ($offset_page + 1) && $show_pages < $pages && $page + $offset_page < $pages) $end_omit = '...';
  74. }
  75. ?>
  76. <!--首页-->
  77. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=1' ?>">首页</a>
  78. <!--前一页-->
  79. <?php
  80. //前一页=当前页-1
  81. $prev = $page - 1;
  82. //如果当前页等于1,那么前一页也等于1,防止出现负页数
  83. if ($page == 1) $prev = 1;
  84. ?>
  85. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $prev ?>">向上</a>
  86. <!--前二页-->
  87. <?php if ($page > ($offset_page + 1)): ?>
  88. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=1' ?>">1</a>
  89. <?php endif ?>
  90. <?php if ($page > ($offset_page + 2)): ?>
  91. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=2' ?>">2</a>
  92. <?php endif ?>
  93. <!--前置省略号-->
  94. <?php if (isset($start_omit)): ?><a href="#"><?php echo $start_omit ?></a><?php endif ?>
  95. <!--根据总页数渲染分页条数据-->
  96. <!--将起始页和总页码置换-->
  97. <?php for ($i=$start_page; $i<=$end_page; $i++): ?>
  98. <?php
  99. $jump = sprintf('%s?p=%s', $_SERVER['PHP_SELF'], $i);
  100. $active = ($i == $page) ? 'active' : null;
  101. ?>
  102. <!--jump为跳转按钮,用来设置当前页-->
  103. <!--active用来设置类名应用样式-->
  104. <!--i用来设置页码名称-->
  105. <a href="<?php echo $jump ?>" class="<?php echo $active ?>"><?php echo $i ?></a>
  106. <?php endfor ?>
  107. <!--后置省略号-->
  108. <?php if (isset($end_omit)): ?><a href="#"><?php echo $end_omit ?></a><?php endif ?>
  109. <!--后二页-->
  110. <?php if ($page > ($offset_page + 2) && ($page + $offset_page) < $n): ?>
  111. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $n ?>"><?php echo $n ?></a>
  112. <?php endif ?>
  113. <?php if ($page > ($offset_page + 1) && ($page + $offset_page) < $pages): ?>
  114. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $pages ?>"><?php echo $pages ?></a>
  115. <?php endif ?>
  116. <!--下一页-->
  117. <?php
  118. //下一页=当前页+1
  119. $next = $page + 1;
  120. //如果当前页等于总页数,那么下一页等于总页数,防止出现无线递增的页数
  121. if ($page == $pages) $next = $pages;
  122. ?>
  123. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $next ?>">向下</a>
  124. <!--尾页-->
  125. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $pages ?>">尾页</a>
  126. </p>
  127. <!--删除记录前弹出确认框-->
  128. <script>
  129. function del(id) {
  130. return confirm('是否删除?') ? location.href='handle3.php?action=del&id='+id : false;
  131. }
  132. </script>
  133. </body>
  134. </html>
  • edit.php
  1. <?php
  2. //获取要被编辑的员工的数据
  3. $staff = $pdo->query("SELECT * FROM `userinfo` WHERE `id`={$id}")->fetch(PDO::FETCH_ASSOC);
  4. ?>
  5. <!DOCTYPE html>
  6. <html lang="zh_hans">
  7. <head>
  8. <meta charset="UTF-8">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <title>注册页</title>
  11. <link rel="stylesheet" href="\css\edit.css">
  12. </head>
  13. <body>
  14. <h2>编辑表单</h2>
  15. <div class="f-box">
  16. <form action="<?php echo $_SERVER['PHP_SELF'].'?action=doedit&id='.$id ?>"" method="POST">
  17. <fieldset>
  18. <div class="d-box">
  19. <label for="username">姓名:</label>
  20. <input type="text" name="username" id="username" value="<?php echo $staff['user_name'] ?>">
  21. </div>
  22. <div class="d-box">
  23. <label for="sex">性别:</label>
  24. <input type="radio" name="sex" id="sex" value="1" <?php if ($staff['sex'] == '男') echo 'checked' ?>><label for=""></label>
  25. <input type="radio" name="sex" id="sex" value="2" <?php if ($staff['sex'] == '女') echo 'checked' ?>><label for=""></label>
  26. <input type="radio" name="sex" id="sex" value="3" <?php if ($staff['sex'] == '保密') echo 'checked' ?>><label for="">保密</label>
  27. </div>
  28. <div class="d-box">
  29. <label for="email">邮箱:</label>
  30. <input type="email" name="email" id="email" value="<?php echo $staff['email'] ?>">
  31. </div>
  32. <div class="d-box">
  33. <label for="reg_time">注册时间:</label>
  34. <input type="date" name="reg_time" id="reg_time" value="<?php echo date('Y-m-d', $staff['reg_time']) ?>">
  35. </div>
  36. <input type="hidden" name="id" id="id" value="<?php echo $staff['id'] ?>">
  37. <div class="d-box">
  38. <button type="submit">保存</button>
  39. </div>
  40. </fieldset>
  41. </form>
  42. </div>
  43. </body>
  44. </html>
  • handle.php
  1. <?php
  2. //获取分页数据
  3. require 'handle2.php';
  4. //获取方法值
  5. $action =$_GET['action'];
  6. //获取id值
  7. $id = $_GET['id'];
  8. //根据方法值来执行相应的方法
  9. switch ($action) {
  10. //1. 渲染编辑表单
  11. case 'edit':
  12. include './user/edit.php';
  13. break;
  14. //2. 执行编辑操作
  15. case 'doedit':
  16. $sql = 'UPDATE `userinfo` SET `user_name`=:username, `sex`=:sex, `email`=:email, `reg_time`=:reg_time WHERE `id`=:id';
  17. $_POST['reg_time'] = strtotime($_POST['reg_time']);
  18. $stmt = $pdo->prepare($sql);
  19. $stmt->execute($_POST);
  20. if ($stmt->rowCount() === 1) echo '<script>alert("更新成功");location.href="./index.php"</script>';
  21. break;
  22. //3. 执行删除操作
  23. case 'del':
  24. $stmt = $pdo->query("DELETE FROM `userinfo` WHERE `id`=$id;");
  25. if ($stmt->rowCount() === 1) echo '<script>alert("删除成功");location.href="./index.php"</script>';
  26. break;
  27. }







四、课程总结

  • 今天学习了 PHP 的分页,通过上课认真听讲和认真完成老师布置的作业,使得我对 PHP 分页技术的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了分页技术的特点以及它的基本用法。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议