博客列表 >PHP 23 分页展示 (0803mon)

PHP 23 分页展示 (0803mon)

老黑
老黑原创
2020年08月09日 16:53:43696浏览

主要内容:

基于7月31日的数据库连接、基本界面展示、分页计算等继续展开的

  1. 分页展示中的基本功能
    a. 分页条的动态生成
    b. 跳转地址的动态生成
    c. 当前页码的高亮显示
  2. 分页展示中的首尾页、上下页处理
  3. 展示列表中的删除与编辑
  4. 分页展示中缩写及居中等(参考php.cn的样式) - 这部分最后的逻辑要求还是挺高的,参考实战作业吧

1. 分页展示中的基本功能

  1. a. 分页条的动态生成
  2. b. 跳转地址的动态生成
  3. c. 当前页码的高亮显示
  • 正式内容前需要先计算下总“页”数,也就是说一共需要展示多少“页” - pages。计算方法如下:
    计算表中共计有多少条记录?
    每一页显示几条? 5
    总页数 = ceil(记录总数 / 每页的记录数)
    $sql = “SELECT CEIL(COUNT(id)/{$num}) AS total FROM users“;
    计算总页数
    $pages = $pdo->query($sql)->fetch()[‘total’];

  • 这些内容是放在跟连接数据有关的一个php中,page-data.php,也就是7月31日的demo4

  1. <?php
  2. // 连接数据库
  3. require 'connect.php';
  4. // 获取分页数据, 一定要知道的二个数据
  5. // 1. 每页显示的数量
  6. $num = 5;
  7. // 2. 当前页码,默认为1
  8. $page = $_GET['p'] ?? 1;
  9. // 3. 计算每一页的第一条记录的显示偏移量
  10. $offset = ($page - 1) * $num;
  11. // 4. 获取分页数据
  12. // SElECT * FROM `table_name `LIMIT n OFFSET m;
  13. $sql = "SELECT * FROM `users` LIMIT {$num} OFFSET {$offset}";
  14. // 简写
  15. // $sql = "SELECT * FROM `users` LIMIT {$offset}, {$num}";
  16. $users = $pdo->query($sql)->fetchAll();
  17. // print_r($users);
  18. // 计算总页数
  19. //----------------上面的为7月31日的内容,下面为今天的内容。
  20. // 计算表中共计有多少条记录?
  21. // 每一页显示几条? 5
  22. // 总页数 = ceil(记录总数 / 每页的记录数)
  23. $sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `users`";
  24. // 计算总页数
  25. $pages = $pdo->query($sql)->fetch()['total'];
  • 下面则是数据展示的页面,demo1.php
  1. <?php require 'page-data.php' ?>
  2. <!DOCTYPE html>
  3. <html lang="en">
  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="style.css">
  9. </head>
  10. <body>
  11. <table>
  12. <caption>用户信息表</caption>
  13. <thead>
  14. <tr>
  15. <td>id</td>
  16. <td>name</td>
  17. <td>email</td>
  18. <td>操作</td>
  19. </tr>
  20. </thead>
  21. <tbody>
  22. <?php foreach ($users as $user):?>
  23. <tr>
  24. <!-- 短标签来简化变量的显示 -->
  25. <td><?=$user['id']?></td>
  26. <td><?php echo $user['name'] ?></td>
  27. <td><?=$user['email']?></td>
  28. <td><button>编辑</button><button>删除</button></td>
  29. </tr>
  30. <?php endforeach ?>
  31. </tbody>
  32. </table>
  33. <p>
  34. <!-- 1. 分页条的动态生成
  35. 2. 跳转地址的动态生成
  36. 3. 当前页码的高亮显示 -->
  37. <!-- 分页条中的页码应该动态生成 -->
  38. <?php for ($i = 1; $i <= $pages; $i++): ?>
  39. <?php
  40. $jump = sprintf('%s?p=%s',$_SERVER['PHP_SELF'], $i);
  41. /* $_SERVER['PHP_SELF']-也就是展示当前页面
  42. * ?p= 在网页中加入了动态的页面数字
  43. * $i: 分页中的页码
  44. * $page: 在URL中通过GET获取的页码?p=X
  45. */
  46. $active = ($i == $page) ? 'active' : null;
  47. /* $active是css文件中修饰高亮页面数字的类的选项
  48. * 选项变量化,这个地方根据是否为当前页面决定是否将active赋给对应的* 类名。一旦类名等于active了,css文件中.active的style就发挥作用了
  49. */
  50. ?>
  51. <a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
  52. <?php endfor ?>
  53. </p>
  54. </body>
  55. </html>

2. 分页展示中的首尾页、上下页处理

  1. <?php require 'page-data.php' ?>
  2. <!DOCTYPE html>
  3. <html lang="en">
  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="style.css">
  9. </head>
  10. <body>
  11. <table>
  12. <caption>用户信息表</caption>
  13. <thead>
  14. <tr>
  15. <td>id</td>
  16. <td>name</td>
  17. <td>email</td>
  18. <td>操作</td>
  19. </tr>
  20. </thead>
  21. <tbody>
  22. <?php foreach ($users as $user):?>
  23. <tr>
  24. <!-- 短标签来简化变量的显示 -->
  25. <td><?=$user['id']?></td>
  26. <td><?php echo $user['name'] ?></td>
  27. <td><?=$user['email']?></td>
  28. <td>
  29. <button onclick="location.href='handle.php?action=edit&id=<?=$user['id']?>'">编辑</button>
  30. <!--这个地方给编辑及删除两个button增加了操作动作,具体是在
  31. handle.php中实现-->
  32. <button onclick="del(<?=$user['id']?>)">删除</button></td>
  33. </tr>
  34. <?php endforeach ?>
  35. </tbody>
  36. </table>
  37. <p>
  38. <!-- 继续完善分页功能
  39. 1. 首页
  40. 2. 尾页
  41. 3. 上一页
  42. 4. 下一页 -->
  43. <!-- 上一页: 解决页码的越界 -->
  44. <?php
  45. // 获取前一页的页码
  46. $prev = $page -1;
  47. if ($page == 1) $prev =1;
  48. ?>
  49. <?php if ($page != 1): ?>
  50. <!-- 首页 -->
  51. <a href="<?=$_SERVER['PHP_SELF'].'?p=1'?>">首页</a>
  52. <a href="<?=$_SERVER['PHP_SELF'].'?p='.$prev?>">上一页</a>
  53. <?php endif ?>
  54. /* 不等于1的情况显示“首页”和“上一页”。
  55. <?php for ($i = 1; $i <= $pages; $i++): ?>
  56. <?php
  57. $jump = sprintf('%s?p=%s',$_SERVER['PHP_SELF'], $i);
  58. $active = ($i == $page) ? 'active' : null;
  59. ?>
  60. <a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
  61. <?php endfor ?>
  62. <!-- 下一页: 解决页码的越界 -->
  63. <?php
  64. // 获取下一页的页码,超过最后一页后一直保持在最后一页。
  65. $next = $page + 1;
  66. if ($next >= $pages) $next = $pages;
  67. ?>
  68. <?php if ($page != $pages) :?>
  69. <a href="<?=$_SERVER['PHP_SELF'].'?p='.$next ?>">下一页</a>
  70. <!-- 尾页 -->
  71. <a href="<?=$_SERVER['PHP_SELF'].'?p='.$pages?>">尾页</a>
  72. <?php endif ?>
  73. </p>
  74. <script>
  75. // 删除
  76. function del(id) {
  77. return confirm('是否删除?') ? alert('删除成功') :false;
  78. }
  79. </script>
  80. </body>
  81. </html>

3. 展示列表中的删除与编辑

  • 首先是在前端也就是第二部分,加上对应的action。
  1. <button onclick="location.href='handle.php?action=edit&id=<?=$user['id']?>'">编辑</button>
  2. <!--这个地方给编辑及删除两个button增加了操作动作,具体是在handle.php中实现-->
  3. <button onclick="del(<?=$user['id']?>)">删除</button></td>
  • 然后制作对应的handle.php文件。
  1. <?php
  2. require 'connect.php';
  3. // 获取操作
  4. $action = $_GET['action'];
  5. $id = $_GET['id'];
  6. switch ($action) {
  7. // 编辑操作: 1: 渲染编辑表单; 2. 执行编辑操作
  8. // 1: 渲染编辑表单
  9. case 'edit':
  10. // 加载,渲染数据编辑表单
  11. include 'edit.php';
  12. break;
  13. // 2. 执行编辑操作
  14. case 'doedit':
  15. // 更新
  16. $sql = 'UPDATE `users` SET `name`=?, `email`=? WHERE `id`=?';
  17. $stmt = $pdo->prepare($sql);
  18. // 新的数据在$_POST
  19. if (!empty($_POST)) {
  20. $stmt->execute([$_POST['name'], $_POST['email'], $id]);
  21. if ($stmt->rowCount() == 1) echo '<script>alert("更新成功");location.href="demo2.php"</script>';
  22. }
  23. break;
  24. // 删除。这个地方老师仅仅是提示了下,具体整体的实现还需要再去完善。
  25. case 'delete':
  26. $sql = 'DELETE FROM `users` WHERE `id`=?';
  27. $stmt = $pdo->prepare($sql);
  28. $stmt->execute([$id]);
  29. if ($stmt->rowCount() == 1) echo '<script>alert("删除成功");location.href="demo2.php"</script>';
  30. }
  • 对应的增加了一个edit.php文件
  1. <?php
  2. // 获取要被编辑的数据
  3. $user = $pdo->query("SELECT * FROM `users` WHERE `id`={$id}")->fetch();
  4. // print_r($user);
  5. ?>
  6. <!DOCTYPE html>
  7. <html lang="en">
  8. <head>
  9. <meta charset="UTF-8">
  10. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  11. <title>用户编辑</title>
  12. </head>
  13. <body>
  14. <h3>用户编辑</h3>
  15. <form action="<? echo $_SERVER['PHP_SELF']. '?action=doedit&id='.$id?>" method="POST">
  16. <!--id还有一种方法是通过隐藏的id来进行传递,不过这次是通过action直接带入的方式实现了-->
  17. <p>
  18. <label for="name">用户名:</label>
  19. <input type="text" name="name" id="name" value="<?=$user['name']?>">
  20. </p>
  21. <p>
  22. <label for="email">邮箱:</label>
  23. <input type="email" name="email" id="email" value="<?=$user['email']?>">
  24. </p>
  25. <p>
  26. <button>保存</button>
  27. </p>
  28. </form>
  29. </body>
  30. </html>

4. 作业与实战

  • 完成用户信息表中的删除功能
  • 仿php.cn分页,完善你的分页功能[选做]

  • 删除部分自己的实现,首先在前端onclick部分加上action,然后在handle中加入对应code:

  1. <button onclick="location.href='my4handle.php?action=delete&id=<?=$item['id']?>'">delete</button>
  1. case 'delete':
  2. $sql = "DELETE FROM `shao` WHERE `id`=?";
  3. $stmt = $pdo->prepare($sql);
  4. $stmt->execute([$id]);
  5. if ($stmt->rowCount()==1)
  6. echo '<script>alert("Delete sucessfully!"); location.href="my3.php"</script>';
  7. break;

  • php.cn分页有两个特点,当时1-6的时候,完全显示1-8,然后加上…,再加上最后的两页。
  • 同样倒过来也是这样,最后6个数字的时候,会显示最后的8个,然后前面加上…,再前面是1,2。

自己努力实现了下见下面图:


  • 代码如下:
  1. <?php require 'my1.php' ?>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>SHAO's Items</title>
  8. <link rel="stylesheet" href="style.css">
  9. </head>
  10. <body>
  11. <table>
  12. <caption>邵恒头条</caption>
  13. <thead>
  14. <tr>
  15. <td>id</td>
  16. <td>date</td>
  17. <td>title</td>
  18. <td>tags</td>
  19. <td>action</td>
  20. </tr>
  21. </thead>
  22. <tbody>
  23. <?php foreach ($items as $item):?>
  24. <tr>
  25. <td><?=$item['id']?></td>
  26. <td><?=$item['date']?></td>
  27. <td><?=$item['title']?></td>
  28. <td><?=$item['label']?></td>
  29. <td>
  30. <button onclick="location.href='my4handle.php?action=edit&id=<?=$item['id']?>'">edit</button>
  31. <button onclick="location.href='my4handle.php?action=delete&id=<?=$item['id']?>'">delete</button>
  32. </td>
  33. </tr>
  34. <?php endforeach ?>
  35. </tbody>
  36. </table>
  37. <p> <!--这个地方p标签之所以这么靠前,是为了好显示-->
  38. <!--② `首页`、`上一页`的展示和限制-->
  39. <?php
  40. $prevNum = $pageNum - 1;
  41. if ($pageNum == 1) $prevNum=1;
  42. ?>
  43. <a href="<?=$SERVER['PHP_SELF'].'?p='.$prevNum?>">上一页</a>
  44. <?php $active1 = ($pageNum==1)? 'active': null?>
  45. <?php $active2 = ($pageNum==2)? 'active': null?>
  46. <a href="<?=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],1)?>" class = "<?=$active1?>">1</a>
  47. <a href="<?=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],2)?>" class = "<?=$active2?>">2</a>
  48. <!--下面这块是模仿php中文网实现了底部分页导航部分的显示-->
  49. <?php
  50. switch($pageNum){
  51. /*前面几页的展示*/
  52. case $pageNum<7:
  53. for($i=3; $i<10; $i++):
  54. $jump=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
  55. $active = ($i==$pageNum) ? 'active' : null;
  56. ?>
  57. <a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
  58. <?php endfor ?>
  59. <a>...</a>
  60. <?php break; ?>
  61. <!--中间部分页码的展示-->
  62. <?php
  63. case $pageNum>=7 and $pageNum < $pages -7: ?>
  64. <a>...</a>
  65. <?php for($i=$pageNum-3; $i <= $pageNum+3; $i++):
  66. $jump=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
  67. $active = ($i==$pageNum) ? 'active' : null;
  68. ?>
  69. <a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
  70. <?php endfor ?>
  71. <a>...</a>
  72. <?php break; ?>
  73. <!--最后部分页码的展示-->
  74. <?php
  75. case $pageNum >= $pages-7: ?>
  76. <a>...</a>
  77. <?php for($i = $pages-7; $i <= $pages-2; $i++):
  78. $jump=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
  79. $active = ($i==$pageNum) ? 'active' : null;
  80. ?>
  81. <a href="<?=$jump?>" class="<?=$active?>"><?=$i?></a>
  82. <?php endfor ?>
  83. <?php break;
  84. }
  85. ?>
  86. <!--③ `下一页`、`尾页`的展示和限制-->
  87. <?php
  88. $nextNum = $pageNum + 1;
  89. if ($nextNum >= $pages) $nextNum = $pages;
  90. ?>
  91. <?php $activel2 = ($pageNum == $pages-1)? 'active': null?>
  92. <?php $activel = ($pageNum == $pages)? 'active': null?>
  93. <a href="<?=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$pages-1)?>" class = "<?=$activel2?>"><?=$pages-1?></a>
  94. <a href="<?=sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$pages)?>" class = "<?=$activel?>"><?=$pages?></a>
  95. <a href="<?=$SERVER['PHP_SELF'].'?p='.$nextNum?>">下一页</a>
  96. </!->
  97. </body>
  98. </html>

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