Blogger Information
Blog 52
fans 0
comment 3
visits 42311
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php学习:第20章 分页实战(跳转、省略)与MVC
王小飞
Original
749 people have browsed it

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. }

效果图片

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

Correcting teacher:天蓬老师天蓬老师

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