博客列表 >PHP分页

PHP分页

滑稽...
滑稽...原创
2020年05月19日 17:04:561014浏览

php分页功能

1.连接数据库

  1. <?php
  2. $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';
  3. $username = 'root';
  4. $password = 'root';
  5. try {
  6. $pdo = new PDO($dsn, $username, $password);
  7. // 结果集获取方式: 关联
  8. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  9. } catch (Exception $e) {
  10. die($e->getMessage());
  11. }

2.页面渲染

  1. <?php
  2. require 'createPage.php';
  3. ?>
  4. <!DOCTYPE html>
  5. <html lang="en">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  9. <title>分页数据展示</title>
  10. <link rel="stylesheet" href="style.css">
  11. </head>
  12. <body>
  13. <table>
  14. <caption>员工管理系统</caption>
  15. <thead>
  16. <tr>
  17. <th>ID</th>
  18. <th>姓名</th>
  19. <th>入职时间</th>
  20. <th>操作</th>
  21. </tr>
  22. </thead>
  23. <tbody>
  24. <?php foreach ($staffs as $staff) : ?>
  25. <tr>
  26. <td><?php echo $staff['id'] ?></td>
  27. <td><?php echo $staff['name'] ?></td>
  28. <td><?php echo date('Y-m-d', $staff['hiredate']) ?></td>
  29. <td><button onclick="location.href='handle.php?action=edit&id=<?php echo $staff['id'] ?>'">编辑</button>
  30. <button onclick="del(<?php echo $staff['id'] ?>)">删除</button></td>
  31. </tr>
  32. <?php endforeach; ?>
  33. </tbody>
  34. </table>
  35. <!-- 添加跳转到首页, 前一页, 下一页, 尾页的功能 -->
  36. <p>
  37. <!-- 首页-->
  38. <a href="<?php echo $_SERVER['PHP_SELF'].'?p=1'?>">首页</a>
  39. <!-- 前一页-->
  40. <a href="<?php echo $_SERVER['PHP_SELF'] .'?p='.$prev?>">前一页</a>
  41. <!-- 前面省略 -->
  42. <?php if (isset($startOmit)) : ?> <a href="<?php echo $_SERVER['PHP_SELF'].'?p=1'?>">1</a><a href="#"><?php echo $startOmit ?></a> <?php endif ?>
  43. <!-- 分页条 -->
  44. <?php for ($i = $startPage;$i <= $endPage;$i++): ?>
  45. <?php
  46. $jump = sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
  47. $active = ($i == $page) ? 'active' : '';
  48. ?>
  49. <a href="<?= $jump?>" class="<?php echo $active ?>"><?=$i?></a>
  50. <?php endfor ?>
  51. <!-- 后面省略 -->
  52. <?php if (isset($endOmit)) : ?> <a href="#"><?php echo $endOmit ?></a> <a href="<?php echo $_SERVER['PHP_SELF'].'?p='.$total?>"><?=$total?></a><?php endif ?>
  53. <!-- 下一页-->
  54. <a href="<?php echo $_SERVER['PHP_SELF'] .'?p='.$next?>">下一页</a>
  55. <!-- 尾页-->
  56. <a href="<?php echo $_SERVER['PHP_SELF'].'?p=' .$total?>">尾页</a>
  57. <!-- 页面跳转 -->
  58. <form method="get" action="table.php">
  59. <input type="number" value="" name="p">
  60. <button>跳转</button>
  61. </form>
  62. </p>
  63. <script>
  64. function del(id) {
  65. return confirm('是否删除?') ? alert('删除成功') : false;
  66. }
  67. </script>
  68. </body>
  69. </html>

3.数据处理

  1. <?php
  2. //连接数据库
  3. require 'connect.php';
  4. //1.当前的页数/页码
  5. $page = $_GET['p'] ?? 1;
  6. if($_GET['p'] == 0){
  7. $page = 1;
  8. }
  9. //2.每页显示的记录数量
  10. $pageSize = 5;
  11. //3.总页数
  12. $sql = "SELECT CEIL(COUNT(`id`)/$pageSize) AS `total` FROM `user`";
  13. $total = $pdo->query($sql)->fetch()['total'];
  14. //4.偏移量
  15. $offset = $pageSize*($page-1);
  16. //var_dump($pageSize);
  17. //5.分页数据
  18. $sql = "SELECT * FROM `user` LIMIT {$pageSize} OFFSET {$offset}";
  19. $staffs = $pdo->query($sql)->fetchAll();
  20. /**
  21. * 前一页
  22. * 如果当前页码是第一页,页码锁定到第一页
  23. */
  24. $prev = $page - 1;
  25. if($page == 1){
  26. $prev = 1;
  27. }
  28. /**
  29. * 下一页
  30. * 如果下一页的页码大于总页数,页码锁定到总页数
  31. */
  32. $next = $page + 1;
  33. //if ($page == $total) $next = $total;
  34. if($next > $total){
  35. $next = $total;
  36. }
  37. /**
  38. * 1.分页条显示5个页码
  39. */
  40. $showPages = 5;
  41. /**
  42. * 2.分页条起始页码
  43. */
  44. $startPage = 1;
  45. /**
  46. * 3.分页条结束页码 ,等于总页数
  47. */
  48. $endPage = $total;
  49. /**
  50. * 4.分页条的偏移量: (当前分页条显示的页码数 - 1) / 2
  51. */
  52. $offsetPage = ($showPages - 1)/2;
  53. /**
  54. * 只有当前分页条数量 < 总页数, 才有必要显示出省略标记
  55. */
  56. if($showPages < $total){
  57. // 如果当前页 > 偏移量 + 1 , 应该显示前面...
  58. if($page > $offsetPage + 1){
  59. $startOmit = '...';
  60. }
  61. // 如果当前页 + 偏移量 <总页数 , 应该显示后面...
  62. if($showPages < $total && $page + $offsetPage < $total){
  63. $endOmit = '...';
  64. }
  65. // 将当前分页条页码重置
  66. if($page > $offsetPage){
  67. //如果当前分页大于分页偏移量,开始页等于当前页-分页偏移量,
  68. $startPage = $page - $offsetPage;
  69. //结束页等于当前页+分页偏移量,
  70. $endPage = $page + $offsetPage;
  71. //如果结束页大于总页数,锁定结束页
  72. if($endPage > $total) $endPage=$total;
  73. }else{
  74. $startPage = 1;
  75. $endPage = $showPages;
  76. }
  77. // 如果当前页 + 偏移量 > 总页数
  78. if ($page + $offsetPage > $total) {
  79. // 原理, 就是向当前页前面进行借位
  80. // 此时, 新的起点 = 当前位置 - (当前页 + 偏移量 - 原始位置)
  81. $startPage = $startPage - ($total + $offsetPage - $endPage);
  82. }
  83. }

总结

  • 页码偏移量:每页显示的记录数量*(当前页码-1)
  • 分页条偏移量:(当前分页条显示的页码数 - 1) / 2
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议