Blogger Information
Blog 48
fans 3
comment 1
visits 30373
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php分页查询原理与实现
吴长清
Original
507 people have browsed it

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>

效果预览

Correcting teacher:PHPzPHPz

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