博客列表 >php分页查询原理与实现

php分页查询原理与实现

吴长清
吴长清原创
2022年08月22日 09:58:33508浏览

page_refer.php 生成分页码API

  1. <?php
  2. // ! 仿php.cn分页作用参考代码
  3. /**
  4. * 生成分页码
  5. *
  6. * @param integer $page 当前页
  7. * @param integer $pages 总页数
  8. * @return array 如果当前是第8页, 共计20页,返回新数组[1,null,6, 7, 8, 9, 10,null,20]
  9. */
  10. function createPages(int $page, int $pages): array
  11. {
  12. // 1. 生成与总页数长度相同的递增的整数数组
  13. $pageArr = range(1, $pages);
  14. // 2. 只需要当前和前后二页, 其它页码用 false/null 来标记
  15. $paginate = array_map(function ($p) use ($page, $pages) {
  16. return ($p == 1 || $p == $pages || abs($page - $p) <= 2) ? $p : null;
  17. }, $pageArr);
  18. // dump($paginate);
  19. // 去重, 替换
  20. // array_unique():删除数组中重复的内容,只保留一个
  21. // array_slice(): 第一个:在数组$paginate中取出索引从0开始到$page索引的元素;
  22. // 第二个:在数组$paginate中取出从$page取出后面的所有元素
  23. $before = array_unique(array_slice($paginate, 0, $page));
  24. $after = array_unique(array_slice($paginate, $page));
  25. // 用解构进行合并
  26. return [...$before, ...$after];
  27. }

demo.php 获取分页的相关数据

  1. <?php
  2. namespace Pagination;
  3. use PDO;
  4. // 1.获取当前页码
  5. // $_GET['p'] : 从地址栏获取变量p的值,也就是当前页码
  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. // 数据库连接
  16. $db = new PDO('mysql:host=localhost;dbname=phpedu;port:3306;charset=utf8', 'root', 'root');
  17. // 4.获取总记录数
  18. $sql = 'SELECT COUNT(*) AS `total` FROM `user`';
  19. // 创建对象
  20. $stmt = $db->prepare($sql);
  21. // 执行sql
  22. $stmt->execute();
  23. // 将数据库查询的总数量绑定给变量 total
  24. $stmt->bindColumn('total', $total);
  25. $stmt->fetch();
  26. echo '当前总记录数量: total = ' . $total . '<br>';
  27. // 5.获取总页数 ceil向上取整数函数
  28. $pages = ceil($total / $num);
  29. echo '当前总页数: pages = ' . $pages . '<br>';
  30. // 6.按条件获取分页查询的数据
  31. $sql = "SELECT * FROM user LIMIT $offset,$num";
  32. // 创建对象并执行sql
  33. $stmt = $db->prepare($sql);
  34. $stmt->execute();
  35. // 得到关联数组
  36. $staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);
  37. // 分页条函数 得到新的总数
  38. require 'page_refer.php';
  39. $newPages = createPages($page, $pages);
  40. print_r($newPages);
  41. // 在头部和尾部追加元素
  42. array_unshift($newPages, '上一页');
  43. array_push($newPages, '下一页');
  44. ?>

demo.php样式表

  1. <style>
  2. table {
  3. width: 400px;
  4. border-collapse: collapse;
  5. text-align: center;
  6. }
  7. table th,
  8. table td {
  9. border: 1px solid;
  10. padding: 5px;
  11. }
  12. table thead {
  13. background-color: lightcyan;
  14. }
  15. table caption {
  16. font-size: larger;
  17. margin-bottom: 8px;
  18. }
  19. body>p {
  20. display: flex;
  21. }
  22. p>a {
  23. text-decoration: none;
  24. color: #555;
  25. border: 1px solid;
  26. padding: 5px 10px;
  27. margin: 10px 2px;
  28. }
  29. .none {
  30. text-decoration: none;
  31. color: #555;
  32. border: none;
  33. padding: 5px 10px;
  34. margin: 10px 2px;
  35. }
  36. .active {
  37. background-color: seagreen;
  38. color: white;
  39. border: 1px solid seagreen;
  40. }
  41. </style>

demo.phphtml与php代码片段渲染

  1. <table>
  2. <caption>员工信息表</caption>
  3. <thead>
  4. <tr>
  5. <th>ID</th>
  6. <th>姓名</th>
  7. <th>性别</th>
  8. <th>邮箱</th>
  9. </tr>
  10. </thead>
  11. <tbody>
  12. <!-- extract 直接解构关联数组中的键作为变量名称 -->
  13. <?php foreach ($staffs as $staff) : extract($staff) ?>
  14. <tr>
  15. <td><?= $id ?>
  16. </td>
  17. <td><?= $name ?>
  18. </td>
  19. <td><?= $sex ? '女' : '男'; ?>
  20. </td>
  21. <td><?= $email ?>
  22. </td>
  23. </tr>
  24. <?php endforeach ?>
  25. </tbody>
  26. </table>
  27. <p>
  28. <?php foreach ($newPages as $key => $value) :
  29. // 实现页码高亮
  30. $page = $_GET['p'] ?? 1;
  31. $active = ($value == $page) ? 'active' : null;
  32. $isNnoe = '';
  33. $value = ($value == null) ? '...' : $value;
  34. $isNnoe = ($value == '...') ? 'none' : null;
  35. //页码跳转的url
  36. if ($value === "上一页") {
  37. // 越界
  38. $url = ($page <= 1) ? ($_SERVER['PHP_SELF'] . '?p=' . $newPages[$key + 1]) : ($_SERVER['PHP_SELF'] . '?p=' . ($page - 1));
  39. } else if ($value === "下一页") {
  40. $url = ($page >= $pages) ? ($_SERVER['PHP_SELF'] . '?p=' . $newPages[$key - 1]) : ($_SERVER['PHP_SELF'] . '?p=' . ($page + 1));
  41. // $url = $_SERVER['PHP_SELF'] . '?p=' . ($page + 1);
  42. } else if ($value == '...') {
  43. $url = $_SERVER['PHP_SELF'] . '#';
  44. } else {
  45. $url = $_SERVER['PHP_SELF'] . '?p=' . $value;
  46. }
  47. ?>
  48. <a href="<?= $url ?>" class="<?= $active . ' ' . $isNnoe ?>"><?= $value ?></a>
  49. <?php endforeach ?>
  50. </p>

效果预览

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