博客列表 >php学习:第20章 分页实战(跳转、省略)与MVC

php学习:第20章 分页实战(跳转、省略)与MVC

王小飞
王小飞原创
2020年05月14日 15:27:41750浏览

MVC

Model.php模型类

  1. <?php
  2. namespace mvc_demo;
  3. // 模型类: 用于数据库操作
  4. class Model
  5. {
  6. //获取数据库方法
  7. public function getData()
  8. {
  9. return (new \PDO('mysql:host=localhost;dbname=phpedu', 'root','root'))
  10. ->query('SELECT * FROM `staffs` LIMIT 10')
  11. ->fetchAll(\PDO::FETCH_ASSOC);
  12. }
  13. }

View.php 视图

  1. <?php
  2. namespace mvc_demo;
  3. // 视图类
  4. class View
  5. {
  6. //视图方法 显示用户所需数据
  7. public function fetch($data)
  8. {
  9. $table = '<table>';
  10. $table .= '<caption>员工信息表</caption>';
  11. $table .= '<tr><th>ID</th><th>姓名</th><th>性别</th><th>职务</th><th>手机号</th><th>入职时间</th></tr>';
  12. // 将数据循环遍历出来
  13. foreach ($data as $staff) {
  14. $table .= '<tr>';
  15. $table .= '<td>' . $staff['id'] . '</td>';
  16. $table .= '<td>' . $staff['name'] . '</td>';
  17. $table .= '<td>' . ($staff['sex'] ? '男' : '女') . '</td>';
  18. $table .= '<td>' . $staff['position'] . '</td>';
  19. $table .= '<td>' . $staff['mobile'] . '</td>';
  20. $table .= '<td>' . date('Y年m月d日', $staff['hiredate']) . '</td>';
  21. $table .= '</tr>';
  22. }
  23. $table .= '</table>';
  24. return $table;
  25. }
  26. }
  27. //样式
  28. echo '<style>
  29. table {border-collapse: collapse; border: 1px solid;text-align: center; width: 500px;height: 150px;width: 600px;}
  30. caption {font-size: 1.2rem; margin-bottom: 10px;}
  31. tr:first-of-type { background-color:wheat;}
  32. td,th {border: 1px solid; padding:5px}
  33. </style>';

控制器 第一种注入

  1. <?php
  2. namespace mvc_demo;
  3. // 控制器1
  4. // 1. 加载模型类
  5. require 'Model.php';
  6. // 2. 加载视图
  7. require 'View.php';
  8. // 3. 创建控制
  9. class Controller2
  10. {
  11. public function index(Model $model, View $view)
  12. {
  13. // 1. 获取数据
  14. $data = $model->getData();
  15. // 2. 渲染模板/视图
  16. return $view->fetch($data);
  17. }
  18. public function index2(Model $model, View $view)
  19. {
  20. }
  21. }
  22. // 客户端
  23. $model = new Model;
  24. $view = new View;
  25. // 实例化控制器类
  26. $controller = new Controller2;
  27. echo $controller->index($model, $view);

控制器 第二种注入

  1. <?php
  2. namespace mvc_demo;
  3. // 控制器依赖注入点改到构造方法, 实现对外部依赖对象的共享
  4. // 1. 加载模型类
  5. require 'Model.php';
  6. // 2. 加载视图
  7. require 'View.php';
  8. // 3. 创建控制
  9. class Controller3
  10. {
  11. // 依赖对象属性
  12. private $model;
  13. private $view;
  14. // 构造方法
  15. public function __construct(Model $model, View $view)
  16. {
  17. $this->model = $model;
  18. $this->view = $view;
  19. }
  20. public function index()
  21. {
  22. // 1. 获取数据
  23. $data = $this->model->getData();
  24. // 2. 渲染模板/视图
  25. return $this->view->fetch($data);
  26. }
  27. public function index2()
  28. {
  29. // 1. 获取数据
  30. $data = $this->model->getData();
  31. // 2. 渲染模板/视图
  32. return $this->view->fetch($data);
  33. }
  34. }
  35. // 客户端
  36. $model = new Model;
  37. $view = new View;
  38. // 实例化控制器类
  39. $controller = new Controller3($model, $view);
  40. echo $controller->index();
  41. // 当前类中对其它类的实例化都在当前类中完成, 造成代码间中的耦合度过高, 过分依赖外部对象
  42. // 使用依赖注入的方式

2.分页

首页文件index.php

  1. <?php
  2. // 连接数据库
  3. require 'connect.php';
  4. // 1. 当前的页数/页码
  5. $page = $_GET['p'] ?? 1;
  6. // 2. 每页显示的记录数量
  7. $num = 5;
  8. // 3. 总页数
  9. $sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `jizhang`";
  10. $pages = $pdo->query($sql)->fetch()['total'];
  11. // 4. 偏移量
  12. $offset = $num * ($page - 1);
  13. // 5. 分页数据
  14. $sql = "SELECT * FROM `jizhang` LIMIT {$num} OFFSET {$offset}";
  15. $staffs = $pdo->query($sql)->fetchAll();
  16. // print_r($staffs);
  17. // 超过总页数提示
  18. $err = "<script>alert('页码超出总页码');location.href='demo4.php';</script>";
  19. //当前页码
  20. $page = $_GET['p'] ?? 1 ;
  21. if ($page>$pages){
  22. die($err);
  23. }
  24. ?>
  25. <!DOCTYPE html>
  26. <html lang="en">
  27. <head>
  28. <meta charset="UTF-8">
  29. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  30. <title>分页数据展示</title>
  31. <link rel="stylesheet" href="style.css">
  32. </head>
  33. <body>
  34. <table>
  35. <caption>消费明细表</caption>
  36. <thead>
  37. <tr>
  38. <th>ID</th>
  39. <th>金额</th>
  40. <th>账户</th>
  41. <th>成员</th>
  42. <th>备注</th>
  43. <th>用户id</th>
  44. <th>入职时间</th>
  45. <th>操作</th>
  46. </tr>
  47. </thead>
  48. <tbody>
  49. <?php foreach ($staffs as $staff) : ?>
  50. <tr>
  51. <td><?php echo $staff['id'] ?></td>
  52. <td><?php echo $staff['jine'] ?></td>
  53. <td><?php echo $staff['zhanghu'] ?></td>
  54. <td><?php echo $staff['chengyuan'] ?></td>
  55. <td><?php echo $staff['beizhu'] ?></td>
  56. <td><?php echo $staff['yonghuid'] ?></td>
  57. <td><?php echo date('Y / m / d', $staff['shijian']) ?></td>
  58. <td><button onclick="location.href='handle.php?action=edit&id=<?php echo $staff['id'] ?>'">编辑</button>
  59. <button onclick="location.href='handle.php?action=del&id=<?php echo $staff['id'] ?>'">删除</button>
  60. </td>
  61. </tr>
  62. <?php endforeach; ?>
  63. </tbody>
  64. </table>
  65. <!-- 添加跳转到首页, 前一页, 下一页, 尾页的功能 -->
  66. <!-- 页码开始 -->
  67. <p>
  68. <?php
  69. // 1. 分页显示多少个页码 这里定义为5个
  70. $showPages = 5;
  71. // 2. 分页条的起始页码
  72. $startPage = 1;
  73. // 3. 分页条的终止页码 终止页码等于现在最多页码
  74. $endPage = $pages; // 当前总页数: 14
  75. // 4. 分页条的偏移量: (当前分页条显示的页码数 - 1) / 2
  76. $offsetPage = ($showPages -1) / 2; // 2
  77. // 只有当前分页条数量 < 总页数, 才有必要显示出省略标记
  78. if ($showPages < $pages) {
  79. // 如果当前页 > 偏移量 + 1 , 应该显示...
  80. if ($page > $offsetPage + 1) {
  81. $startOmit = '...';
  82. }
  83. // 将当前分页条页码重置
  84. if ($page > $offsetPage) {
  85. $startPage = $page - $offsetPage;
  86. $endPage = $page + $offsetPage;
  87. if ($endPage > $pages) {$endPage = $pages;}
  88. } else {
  89. $startPage = 1;
  90. $endPage = $showPages;
  91. }
  92. // 如果当前页 + 偏移量 > 总页数
  93. if ($page + $offsetPage > $pages) {
  94. // 原理, 就是向当前页前面进行借位
  95. // 此时, 新的起点 = 当前位置 - (当前页 + 偏移量 - 原始位置)
  96. $startPage = $startPage - ($page + $offsetPage - $endPage);
  97. }
  98. if ($showPages < $pages && $page + $offsetPage < $pages) $endOmit = '...';
  99. }
  100. ?>
  101. <!-- 首页 -->
  102. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=1' ?>">首页</a>
  103. <!-- 前一页 -->
  104. <?php
  105. $prev = $page - 1;
  106. if ($page == 1) $prev = 1;
  107. ?>
  108. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $prev ?>">前一页</a>
  109. <?php if (isset($startOmit)) : ?> <a href="#"><?php echo $startOmit ?></a> <?php endif ?>
  110. <?php for ($i=$startPage; $i<=$endPage; $i++): ?>
  111. <?php
  112. $jump = sprintf('%s?p=%s', $_SERVER['PHP_SELF'], $i );
  113. $active = ($i == $page) ? 'active' :null;
  114. ?>
  115. <a href="<?php echo $jump ?>" class="<?php echo $active ?>"><?php echo $i ?></a>
  116. <?php endfor ?>
  117. <?php if (isset($endOmit)) : ?> <a href="#"><?php echo $endOmit ?></a> <?php endif ?>
  118. <!-- 下一页 -->
  119. <?php
  120. $next = $page + 1;
  121. if ($page == $pages) $next = $pages;
  122. ?>
  123. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p=' . $next ?>">下一页</a>
  124. <!-- 尾页 -->
  125. <a href="<?php echo $_SERVER['PHP_SELF'] . '?p='. $pages ?>">尾页</a>
  126. <form class="form1" action="" method="get">
  127. <input type="number" name="p"min="1" max="{$pages}" required />
  128. <button>跳转</button>
  129. </form>
  130. </p>
  131. </body>
  132. </html>

handle.php页

  1. <?php
  2. require 'demo1.php';
  3. $action = $_GET['action'];
  4. $id = $_GET['id'];
  5. switch ($action) {
  6. // 编辑需要进行二步
  7. // 1. 渲染编辑表单
  8. case 'edit':
  9. include 'edit.php';
  10. break;
  11. // 2. 执行编辑操作
  12. case 'doedit':
  13. $sql = 'UPDATE `jizhang` SET `jine`=:jine, `zhanghu`=:zhanghu,`chengyuan`=:chengyuan,`beizhu`=:beizhu ,`yonghuid`=:yonghuid,`shijian`=:shijian WHERE `id`=:id';
  14. // print_r($_POST);
  15. // $_POST['id'] = $id;
  16. $_POST['shijian'] = strtotime($_POST['shijian']);
  17. $stmt = $pdo->prepare($sql);
  18. $stmt->execute($_POST);
  19. if ($stmt->rowCount() === 1) echo '<script>alert("更新成功");location.href="demo4.php";</script>';
  20. // 3. 删除
  21. case 'del':
  22. $stmt = $pdo->query("delete from `jizhang` where `id`=$id");
  23. if ($stmt->rowCount() === 1) echo '<script>alert("删除成功");location.href="demo4.php";</script>';
  24. break;
  25. }

编辑页面edit.php

  1. <?php
  2. // 获取要被编辑的员工信息
  3. $staff = $pdo->query("SELECT * FROM `jizhang` WHERE `id`={$id}")->fetch();
  4. // print_r($staff);
  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>Document</title>
  12. </head>
  13. <body>
  14. <h3>编辑消费明细</h3>
  15. <form action="<?php echo $_SERVER['PHP_SELF'].'?action=doedit&id='. $id ?>" method="post">
  16. <p>
  17. <label for="jine">金额:</label>
  18. <input type="text" id="name" name="jine" value="<?php echo $staff['jine'] ?>">
  19. </p>
  20. <p>
  21. <label for="zhanghu">账户:</label>
  22. <input type="text" id="age" name="zhanghu" value="<?php echo $staff['zhanghu'] ?>">
  23. </p>
  24. <input type="hidden" name="id" value="<?php echo $staff['id'] ?>">
  25. <p>
  26. <label for="chengyuan">成员:</label>
  27. <input type="text" id="age" name="chengyuan" value="<?php echo $staff['chengyuan'] ?>">
  28. </p>
  29. <p>
  30. <label for="beizhu">备注:</label>
  31. <input type="text" id="position" name="beizhu" value="<?php echo $staff['beizhu'] ?>">
  32. </p>
  33. <p>
  34. <label for="yonghuid">用户id:</label>
  35. <input type="text" id="tel" name="yonghuid" value="<?php echo $staff['yonghuid'] ?>">
  36. </p>
  37. <p>
  38. <label for="shijian">手机号:</label>
  39. <input type="text" id="hiredate" name="shijian" value="<?php echo date('Y-m-d', $staff['shijian']) ?>">
  40. </p>
  41. <p>
  42. <button>保存</button>
  43. </p>
  44. </form>
  45. </body>
  46. </html>

前端样式style.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: 80%;
  15. border: 1px solid;
  16. border-collapse: collapse;
  17. text-align: center;
  18. }
  19. table caption {
  20. font-size: 1.2rem;
  21. margin: 10px;
  22. }
  23. table td,
  24. table th {
  25. border: 1px solid;
  26. padding: 5px;
  27. }
  28. table tr:hover {
  29. background-color: #eee;
  30. }
  31. table thead tr:only-of-type {
  32. background-color: lightblue;
  33. }
  34. table button {
  35. width: 56px;
  36. height: 26px;
  37. }
  38. table button:last-of-type {
  39. color: red;
  40. }
  41. table button {
  42. cursor: pointer;
  43. margin: 0 3px;
  44. }
  45. /*分页条样式*/
  46. body > p {
  47. display: flex;
  48. }
  49. p > a {
  50. text-decoration: none;
  51. color: #555;
  52. border: 1px solid;
  53. padding: 5px 10px;
  54. margin: 10px 2px;
  55. }
  56. .active {
  57. background-color: red;
  58. color: white;
  59. border: 1px solid red;
  60. }

效果图片

总结:分页理解的比较透了,分页省略这个有点逻辑上的复杂,以后应该会遇到很多这样的或者更复杂的逻辑,应该多看多思考。

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