Blogger Information
Blog 33
fans 0
comment 0
visits 27766
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
服务端 - PHP - 分页
Original
782 people have browsed it

服务端 - 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 分页技术的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了分页技术的特点以及它的基本用法。
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