博客列表 >PHP原生态!控制+模型+列表渲染+算法分页,啥也不说了,自己看吧…

PHP原生态!控制+模型+列表渲染+算法分页,啥也不说了,自己看吧…

张福根一修品牌运营
张福根一修品牌运营原创
2020年12月13日 16:03:312190浏览

数据编辑与PHP实现带省略标志的算法分页

效果展示:

数据编辑与PHP实现带省略标志的算法分页

一、数据编辑与删除

1、定义数据库(databases.php)

  1. <?php
  2. namespace zhangfugen;
  3. return [
  4. 'type' => $type ?? 'mysql',
  5. 'host' => $host ?? 'localhost',
  6. 'dbname' => $dbname ?? 'apple',
  7. 'port' => $port ?? '3306',
  8. 'charset' => $charset ?? 'utf8',
  9. 'username' => $username ?? 'root',
  10. 'password' => $password ?? '123456'
  11. ];

2、连接数据库(connect.php)

  1. <?php
  2. namespace zhangfugen2;
  3. $config = require __DIR__ . '/database.php';
  4. use PDO;
  5. //PDO数据连接~三要素 DSN数据源 username password,
  6. extract($config);
  7. $dsn = sprintf('%s:host=%s;dbname=%s',$type,$host,$dbname);
  8. try {
  9. $pdo = new PDO($dsn,$username ,$password,[PDO::ATTR_ERRMODE=> PDO::ERRMODE_WARNING]);
  10. // var_dump($pdo);
  11. //设置结果集的默认获取方式,只获取关联数组部分
  12. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
  13. } catch(\Exception $e) {
  14. die('Connection error: '. $e->getMessage());
  15. }

3、获取分页数据(userdata.php)

  1. //获取分页数据
  2. // 定义每页显示的数量
  3. $num = 10;
  4. //当前页码,默认为1
  5. $page = $_GET['p'] ?? 1;
  6. //计算偏移量(偏移量 = (页码 -1) \* 每页的显示数量)
  7. $offset = ($page - 1) * $num ;
  8. //获取分页数据
  9. $sql = " SELECT `id`,`uname`,`age`,`type`,`skill` FROM `users` ORDER BY `id` ASC LIMIT {$num} OFFSET {$offset} ";
  10. $users = $pdo->query($sql)->fetchAll();
  11. //获取总页数,ceil() 函数向上舍入为最接近的整数
  12. $sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `users`";
  13. $pages = $pdo->query($sql)->fetch()['total'];

4、控制分发器:编辑+删除(userhandle.php)

  1. <?php
  2. require 'connect.php';
  3. //获取get参数
  4. $action = $_GET['action'];
  5. $id = $_GET['id'];
  6. switch(strtolower($action)):
  7. //编辑操作 :1.渲染编辑表单
  8. // 1.渲染编辑表单
  9. case 'edit':
  10. require 'useredit.php';
  11. break;
  12. //2.执行编辑操作
  13. case 'doedit':
  14. //更新数据表数据
  15. $sql = 'UPDATE `users` SET `uname`= ?, `age` = ?, `type` = ?, `skill` = ? WHERE `id` =?;';
  16. $stmt = $pdo->prepare($sql);
  17. $stmt->execute([$_POST['uname'],$_POST['age'],$_POST['type'],$_POST['skill'],$id]);
  18. if($stmt->rowCount() == 1) echo '<script>alert("更新成功");location.href = "userlist2.php"</script>';
  19. break;
  20. // 删除
  21. case 'delete':
  22. $sql = 'DELETE FROM `users` WHERE `id`=?';
  23. $stmt = $pdo->prepare($sql);
  24. $stmt->execute([$id]);
  25. if ($stmt->rowCount() == 1) echo '<script>alert("删除成功");location.href="userlist2.php"</script>';
  26. default:
  27. die('非法操作');
  28. break;
  29. endswitch;

5、用户编辑页(useredit.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. <link rel="stylesheet" href="editstyle.css">
  13. </head>
  14. <body>
  15. <h3>用户编辑</h3>
  16. <form action="<? echo $_SERVER['PHP_SELF'].'?action=doedit&id='.$id ?>" method="POST">
  17. <p>
  18. <label for="uname">名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;称</label>
  19. <input type="text" id="uname" name="uname" value="<?=$user['uname']?>">
  20. </p>
  21. <p>
  22. <label for="age">年&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;龄</label>
  23. <input type="number" name="age" id="age" value="<?=$user['age']?>">
  24. </p>
  25. <p>
  26. <label for="type">工&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;种</label>
  27. <input type="text" name="type" id="type" value="<?=$user['type']?>">
  28. </p>
  29. <p>
  30. <label for="skill">擅长技能</label>
  31. <input type="text" name="skill" id="skill" value="<?=$user['skill']?>">
  32. </p>
  33. <p>
  34. <button>保存</button>
  35. </p>
  36. </form>
  37. </body>
  38. </html>

编辑页CSS(editstyle.css)

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. color: #555;
  6. }
  7. body {
  8. display: flex;
  9. flex-direction: column;
  10. align-items: center;
  11. background-color: #e8f4f8;
  12. }
  13. /*表单样式*/
  14. form {
  15. width: 400px;
  16. border-collapse: collapse;
  17. text-align: center;
  18. background-color: lightblue;
  19. padding: 20px;
  20. }
  21. h3 {
  22. font-size: 1.3rem;
  23. margin: 10px;
  24. }
  25. form p {
  26. padding: 7px;
  27. font-size: 0.8rem;
  28. }
  29. label,
  30. input {
  31. padding: 2px;
  32. font-size: 0.9rem;
  33. line-height: 25px;
  34. }
  35. button {
  36. width: 250px;
  37. padding: 7px;
  38. }

二、数据列表页面(userlist2.php)

算法分页实现原理:1.首页,2.尾页,3.上一页,4.下一页,5.省略 等功能

  1. <?php
  2. require 'userdata.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="userstyle.css">
  11. </head>
  12. <body>
  13. <table>
  14. <caption>【久益一修】装修工人信息表</caption>
  15. <thead>
  16. <tr>
  17. <td>编号</td>
  18. <td>姓名</td>
  19. <td>年龄</td>
  20. <td>工种</td>
  21. <td>擅长技能</td>
  22. <td>操作</td>
  23. </tr>
  24. </thead>
  25. <tbody>
  26. <?php foreach($users as $user):?>
  27. <tr>
  28. <td><?= $user['id']?></td>
  29. <td><?= $user['uname']?></td>
  30. <td><?= $user['age']?></td>
  31. <td><?= $user['type']?></td>
  32. <td><?= $user['skill']?></td>
  33. <td>
  34. <button onclick="location.href='userhandle.php?action=edit&id=<?=$user['id']?>'">编辑</button>
  35. <button onclick="location.href='userhandle.php?action=delete&id=<?=$user['id']?>'">删除</button>
  36. </td>
  37. </tr>
  38. <?php endforeach;?>
  39. </tbody>
  40. </table>
  41. <!-- ======================================= -->
  42. <?php
  43. // 分页条显示的页数
  44. $showPages =5;
  45. // 分页条的起始页码值
  46. $startPage = 1;
  47. // 分页条的终止页码值
  48. $endPage = $pages;
  49. // 分页条的终止页码相对于当前页码的偏移量: 分页条显示的页数减1再除2
  50. $offsetPage = ($showPages - 1) / 2;
  51. // 只有当前分页条显示页码数量 < 总页数时, 才有必要显示出省略标志
  52. if ($showPages < $pages) {
  53. //如果当前页码大于偏移量加1, 应该显示省略标记
  54. if ($page > $offsetPage + 1) {
  55. $startOmit = '...';
  56. }
  57. // 如果当前页, 大于偏移量, 就需要重置一下新分页条的起止点页码
  58. if ($page > $offsetPage) {
  59. // 当前分页条的起始页码 = 当前页码 - 偏移量
  60. $startPage = $page - $offsetPage;
  61. // 当前分页条的结束页码 = 当前页码 + 偏移量
  62. $endPage = $page + $offsetPage;
  63. // 当前页码 + 偏移量, 有可能会大于总页数,所以要进行检测
  64. if ($endPage > $pages) {$endPage = $pages; }
  65. } else {
  66. // 如果当前页码 < 偏移量, 如当前是第2页,当前页码就等于偏移量
  67. // 此时需要重新设置新分页条的起始页码
  68. $startPage = 1;
  69. //结束页码就等于显示页码数量
  70. $endPage = $showPages;
  71. }
  72. // 如果当前页 + 偏移量 > 总页数
  73. if ($page + $offsetPage > $pages) {
  74. // 例如总页码10, 当前为9页, 则9+2>10, 此时需要向前面借位偏移,才能保证仍然显示为5个页码
  75. // 此时, 新的起始位置 = 当前位置 - (当前页 + 偏移量 - 原来的结束位置)
  76. $startPage = $page - $offsetPage-1 ;
  77. }
  78. // 只要当前显示的页码数量 < 总页数 并且 当前页+偏移量也小于总页数, 那就应该显示出后面的省略号
  79. if ($showPages < $pages && $page + $offsetPage < $pages) $endOmit = '...';
  80. }
  81. ?>
  82. <!-- ======================================= -->
  83. <p>
  84. <!-- 首页-->
  85. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=1' ?>">首页</a>
  86. <!--防止向前越界-->
  87. <?php $prev = $page - 1; if ($page == 1) { $prev = 1;} ?>
  88. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $prev ?>">上一页</a>
  89. <!--省略标插入:在下一页的后面-->
  90. <?php if (isset($startOmit)): ?><a href="javascript:;"><?php echo $startOmit ?></a><?php endif ?>
  91. <!-- ======================================= -->
  92. <!-- 显示页码-->
  93. <!--显示页码是变量:$startPage, 动态的与新分页条保持一致-->
  94. <?php for ($i = $startPage; $i <= $endPage; $i++) : ?>
  95. <!-- 当前页面高亮显示 -->
  96. <?php $active = ($i == $page) ? 'active' : null;
  97. // 跳转页码的地址
  98. $jump = sprintf('%s?p=%s', $_SERVER['PHP_SELF'], $i);
  99. ?>
  100. <a href="<?php echo $jump ?>" class="<?php echo $active ?>"><?php echo $i ?></a>
  101. <?php endfor; ?>
  102. <!-- ======================================= -->
  103. <!-- 下一页-->
  104. <!-- 下一页=当前页+1,如果当前页=总页数,下一页=总页数 ,防止向后越界-->
  105. <?php $next = $page + 1; if ($page == $pages) { $next = $pages; } ?>
  106. <!--省略标记插入:在下一页的前面-->
  107. <?php if (isset($endOmit)): ?><a href="javascript:;"><?php echo $endOmit ?></a><?php endif ?>
  108. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $next ?>">下一页</a>
  109. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $pages ?>">尾页</a>
  110. </p>
  111. </body>
  112. </html>

列表页CSS(userstyle.css)

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. color: #555;
  6. }
  7. body {
  8. display: flex;
  9. flex-direction: column;
  10. align-items: center;
  11. }
  12. /*表格样式*/
  13. table {
  14. width: 90%;
  15. border: 1px solid;
  16. border-collapse: collapse;
  17. text-align: center;
  18. }
  19. table caption {
  20. font-size: 1.3rem;
  21. margin: 10px;
  22. }
  23. table td,
  24. table th {
  25. border: 1px solid;
  26. padding: 7px;
  27. font-size: 0.9rem;
  28. }
  29. table tr:hover {
  30. background-color: #eee;
  31. }
  32. table thead tr:only-of-type {
  33. background-color: lightblue;
  34. }
  35. table button {
  36. width: 56px;
  37. height: 26px;
  38. }
  39. table button:last-of-type {
  40. color: coral;
  41. }
  42. table button {
  43. cursor: pointer;
  44. margin: 0 3px;
  45. }
  46. /*分页条样式*/
  47. body > p {
  48. display: flex;
  49. }
  50. p > a {
  51. text-decoration: none;
  52. color: #555;
  53. border: 1px solid;
  54. padding: 5px 10px;
  55. margin: 10px 2px;
  56. }
  57. .active {
  58. background-color: coral;
  59. color: white;
  60. border: 1px solid coral;
  61. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议