博客列表 >分页作业 - PHP培训十期线上班

分页作业 - PHP培训十期线上班

Yin熊
Yin熊原创
2020年05月17日 22:09:50505浏览

一、 分页作业

趁这周末有空,完成了一下分页作业,代码整合到一个文件里来,按自己思路写的时候总体来说没什么问题,但重置分页页码那里一直没想出来。后来结合老师的代码才慢慢弄出来。

最终演示网址:演示网址

  1. <?php
  2. namespace page;
  3. use Exception;
  4. use PDO;
  5. try{
  6. $dns = 'mysql:host=localhost;port=3306;dbname=learn;charset=utf8';
  7. $pdo = new \PDO($dns,'****','****');
  8. } catch (Exception $e) {
  9. echo $e->getMessage();
  10. }
  11. // 获取记录数
  12. $sql = "select count(`id`) as total from user";
  13. $total = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  14. $num = 5; // 设置每页条数
  15. // $page = $_GET['page'] ?? 1; //获取当前页(服务器装的php5,不支持这种写法)
  16. $page = isset($_GET['page']) ? $_GET['page'] : 1; //获取当前页
  17. $page = (int)$page; // 在这不知能否过滤一些攻击
  18. $pages = ceil($total[0]['total']/$num); // 计算总页数/最后一页数
  19. $page = $page > $pages ? $pages : $page; // 当前页不能大于总页数,否则当前页为最后一页
  20. $page = $page <= 1 ? 1 : $page; // 当前页不能小于1,否则当前页为第一页
  21. $offset = $num * ($page - 1); // 计算偏移量,记录数 *( 当前页 - 1 )
  22. $sql = "select * from user limit {$num} offset {$offset}";
  23. $data = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  24. ?>
  25. <!DOCTYPE html>
  26. <html lang="ZH">
  27. <head>
  28. <meta charset="UTF-8">
  29. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  30. <title>分页</title>
  31. <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet">
  32. <style>
  33. .active { color: red; }
  34. </style>
  35. </head>
  36. <body>
  37. <table class="table">
  38. <thead>
  39. <tr>
  40. <th>id</th>
  41. <th>姓名</th>
  42. <th>年龄</th>
  43. <th>性别</th>
  44. <th>工资</th>
  45. <th>出生日期</th>
  46. </tr>
  47. </thead>
  48. <tbody>
  49. <?php foreach($data as $key => $value): ?>
  50. <tr>
  51. <td><?php echo $value['id']; ?></td>
  52. <td><?php echo $value['name']; ?></td>
  53. <td><?php echo $value['age']; ?></td>
  54. <td><?php echo ($value['sex'] == 1) ? '男' : '女'; ?></td>
  55. <td><?php echo $value['salary']; ?></td>
  56. <td><?php echo date('Y-m-d',$value['createtime']); ?></td>
  57. </tr>
  58. <?php endforeach; ?>
  59. </tbody>
  60. </table>
  61. <?php
  62. /**
  63. * 此段php用来省略页码数量
  64. */
  65. // $page 当前页
  66. // $pages 总页数/最后一页
  67. $showPage = 5; // 分页条显示多少页,只能设置奇数
  68. $startPage = 1; // 分页条起始页
  69. $endPage = $pages; // 分页条结束页
  70. $sitePage = ($showPage - 1) / 2; // 分页条当前页的两边显示的页数,如,当前显示5页,当前页的左右两侧各显示两页(偏移量)
  71. // 当显示页数小于总页数当时候才显示`...`
  72. if ( $showPage < $pages ) {
  73. // 若当前页大于左边页数+1,左边显示`...`
  74. if ( $page > $sitePage + 1 ) { $startSign = '...'; }
  75. // 若当前页+右边页数小于总页数,右边显示`...`
  76. if ( $page + $sitePage < $pages ) { $endSign = '...'; }
  77. // 重置分页页码
  78. if ( $page > $sitePage ) { // 如果当前页大于左侧$sitePage个页码(不知道为什么这个作为条件),即左侧从加`...`开始
  79. $startPage = $page - $sitePage; // 重置起始页
  80. $endPage = $page + $sitePage; // 重置结束页
  81. if ( $endPage > $pages ) { $endPage = $pages; } // 上一步重置结束页后,产生多出来的结束页,去掉,使最大结束页不超过总页数。
  82. } else {
  83. $endPage = $showPage; // 重置最前的$sitePage个页码的结束页,否则会将全部页码显示出来。
  84. }
  85. // 解决最后的$sitePage个页码显示不够$showPage个页码问题
  86. if ( $page + $sitePage > $pages ) {
  87. // 此时, 新的起点 = 当前位置 - (当前页 + 偏移量 - 原始位置)
  88. $startPage = $startPage - ( $page + $sitePage -$endPage );
  89. }
  90. }
  91. ?>
  92. <div class="page" style="text-align: center">
  93. <!-- 上一页 -->
  94. <?php if($page != 1): ?>
  95. <?php
  96. $prev = ($page-1 <= 1 ) ? 1 : $page-1;
  97. $prev = sprintf('%s?page=%s',$_SERVER['PHP_SELF'], $prev)
  98. ?>
  99. <a href="<?php echo $_SERVER['PHP_SELF'] . "?page=1"; ?>">首页</a>
  100. <a href="<?php echo $prev; ?>">上一页</a>
  101. <?php endif ?>
  102. <!-- 前省略`...` -->
  103. <?php if(isset($startSign)): ?><a href="#"><?php echo $startSign; ?></a><?php endif ?>
  104. <!-- 主体页码 -->
  105. <?php for($i=$startPage;$i<=$endPage;$i++): ?>
  106. <?php
  107. $href = sprintf('%s?page=%s',$_SERVER['PHP_SELF'], $i);
  108. $active = ( $page == $i ) ? 'active' : '';
  109. ?>
  110. <a href="<?php echo $href; ?>" class="<?php echo $active; ?>"><?php echo $i; ?></a>
  111. <?php endfor ?>
  112. <!-- 后省略`...` -->
  113. <?php if(isset($endSign)): ?><a href="#"><?php echo $endSign; ?></a><?php endif ?>
  114. <!-- 下一页 -->
  115. <?php if($page != $pages): ?>
  116. <?php
  117. $next = ($page+1 >= $pages ) ? $pages : $page+1;
  118. $next = sprintf('%s?page=%s', $_SERVER['PHP_SELF'], $next)
  119. ?>
  120. <a href="<?php echo $next; ?>">下一页</a>
  121. <a href="<?php echo $_SERVER['PHP_SELF'] . "?page=" . $pages; ?>">尾页</a>
  122. <?php endif ?>
  123. <!-- 跳转功能 -->
  124. <form action="" method="get">
  125. <input type="text" name="page">
  126. <input type="submit" value="跳转">
  127. </form>
  128. </div>
  129. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
  130. <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.min.js"></script>
  131. </body>
  132. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议