Blogger Information
Blog 77
fans 0
comment 0
visits 55201
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
原生分页和layui分页,MVC架构原理与依赖注入
Jet的博客
Original
386 people have browsed it

一、原生分页

1、pageData.php文件

根据上节课学习内容,使用pdo对数据库进行操作处理,读取具体数据和总条数进行渲染,分页按 总条数 / 每页多少条 得出页码。

  1. /**
  2. * 分页 limit子句
  3. * pageSize每页获取多绍条数据,当前页page 偏移量
  4. * order by 子句存在limit前面
  5. */
  6. // 页码来自get参数
  7. $page = $_GET['page'] ?? 1;
  8. // 越界检测
  9. $page = $page<1 ? 1: $page;
  10. // 每页显示数量
  11. $pageSize = 4;
  12. // 偏移量 offset
  13. $offset = ($page - 1) * $pageSize;
  14. $db = new PDO('mysql:host=localhost;dbname=phpcn22','root','root');
  15. $sql = 'select id,uname,status from user limit ?,?;';
  16. $stmt = $db->prepare($sql);
  17. $stmt->bindParam(1,$offset,PDO::PARAM_INT);
  18. $stmt->bindParam(2,$pageSize,PDO::PARAM_INT);
  19. $stmt->execute();
  20. $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
  21. // print_r($users);
  22. // 计算总页数
  23. // 1. 计算数据表里所有的记录
  24. $sql = 'SELECT COUNT(id) AS count FROM user;';
  25. $stmt = $db->prepare($sql);
  26. $stmt->execute();
  27. // 获取总页数方法1 :
  28. /* 查询结果里的字段绑定到一个变量上
  29. $stmt->bindColumn('count',$total);
  30. $stmt->fetch();
  31. */
  32. // 获取总页数方法2 :
  33. $total = $stmt->fetch()['count'];
  34. $pages = ceil( $total / $pageSize );

2、index.php文件

  1. <?php
  2. require 'pageData.php';
  3. ?>
  4. <!DOCTYPE html>
  5. <html lang="zh-CN">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <link rel="stylesheet" href="style.css">
  11. <title>Document</title>
  12. </head>
  13. <body>
  14. <table border="1">
  15. <caption>用户表</caption>
  16. <thead>
  17. <tr>
  18. <th>编号</th>
  19. <th>用户名</th>
  20. <th>手机号码</th>
  21. <th>状态</th>
  22. <th>操作</th>
  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>13800138000</td>
  31. <td><?= $user['status'] == 1 ? '正常' : '注销' ?></td>
  32. <td>
  33. <button>删除</button>
  34. <button>编辑</button>
  35. </td>
  36. </tr>
  37. <?php endforeach; ?>
  38. </tbody>
  39. </table>
  40. <p>
  41. <!-- 动态生成分页 -->
  42. <?php
  43. // 上一页
  44. $prev = $page - 1;
  45. // if (expr) {expr1}
  46. // 系统先判断expr是否为真,如果是,则执行后面的语句,
  47. // 如果否,后面的语句就没有执行的必要了;转换成IF语句为
  48. if ($page == 1) $prev = 1;
  49. if ($page != 1) :
  50. ?>
  51. <a href="<?= '?page=' . $prev ?>">上一页</a>
  52. <?php endif; ?>
  53. <?php for($i=1; $i<=$pages; $i++) :
  54. $active = ($i == $page) ? 'active' : null;
  55. ?>
  56. <a href="<?= '?page=' . $i ?>" class="<?= $active ?>"><?= $i ?></a>
  57. <?php endfor ?>
  58. <?php
  59. // 下一页
  60. $next = $page + 1;
  61. if ($next == $page) $next = $page;
  62. // 当前页码不等于总页面,显示下一页
  63. if ($page != $pages) : ?>
  64. <a href="<?= '?page=' . $next ?>">下一页</a>
  65. <?php endif; ?>
  66. </p>
  67. </body>
  68. </html>

3、运行结果:


  1. 重点是index.php文件的 【动态生成分页】代码:
  2. 但是一个是混编,一个没有前后端分离,阅读起来有点费劲。

二、layui分页


1、PDO数据库操作不变。

2、index.php文件

  1. <?php
  2. require 'pageData.php';
  3. ?>
  4. <!DOCTYPE html>
  5. <html lang="zh-CN">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <link rel="stylesheet" href="style.css">
  11. <link rel="stylesheet" href="layui/css/layui.css">
  12. <title>Document</title>
  13. </head>
  14. <body>
  15. <table border="1">
  16. <caption>用户表</caption>
  17. <thead>
  18. <tr>
  19. <th>编号</th>
  20. <th>用户名</th>
  21. <th>手机号码</th>
  22. <th>状态</th>
  23. <th>操作</th>
  24. </tr>
  25. </thead>
  26. <tbody>
  27. <?php foreach ($users as $user): ?>
  28. <tr>
  29. <td><?= $user['id'] ?></td>
  30. <td><?= $user['uname'] ?></td>
  31. <td>13800138000</td>
  32. <td><?= $user['status'] == 1 ? '正常' : '注销' ?></td>
  33. <td>
  34. <button>删除</button>
  35. <button>编辑</button>
  36. </td>
  37. </tr>
  38. <?php endforeach; ?>
  39. </tbody>
  40. </table>
  41. <div id="page">
  42. </div>
  43. <script src="layui/layui.js"></script>
  44. <script>
  45. layui.use(['laypage'],function(){
  46. var laypage = layui.laypage;
  47. //执行一个laypage实例
  48. laypage.render({
  49. elem: 'page' //注意,这里的 test1 是 ID,不用加 # 号
  50. ,
  51. count: <?= $total ?> //数据总数,从服务端得到
  52. ,
  53. limit: <?= $pageSize ?>,
  54. curr: <?= $page ?>
  55. ,
  56. layout: ['prev', 'page', 'next', 'count'],
  57. jump: function(obj, first) {
  58. // obj包含了当前分页的所有参数,比如:
  59. //首次不执行
  60. if (!first) {
  61. window.location.href = '?page=' + obj.curr;
  62. }
  63. }
  64. });
  65. });
  66. </script>

2、运行结果:


  1. 使用layui插件方便快捷,代码易读性良好!

三、MVC架构

MVC框架理解:

  • M:model模型,对数据库管理、操作;
  • V:view试图,前端视图格式化;
  • C:controller控制器,请求派发器,用户点击等事件进行处理。

案例:

1、Medel.php文件

  1. <?php
  2. // 模型 数据操作
  3. namespace mvc_demo;
  4. use PDO;
  5. class Model
  6. {
  7. public function getData()
  8. {
  9. return (new PDO('mysql:host=localhost;dbname=phpcn22;','root','root'))
  10. ->query('select id, uname, status from user order by id asc limit 0,5')
  11. ->fetchAll(PDO::FETCH_ASSOC);
  12. }
  13. public function editData()
  14. {
  15. }
  16. }

2、View.php文件

  1. <?php
  2. namespace mvc_demo;
  3. class view
  4. {
  5. public function fetch($data)
  6. {
  7. $table = '<table>';
  8. $table .= '<caption>用户信息表</caption>';
  9. $table .= '<tr><th>编号</th><th>姓名</th><th>手机号</th><th>状态</th><th>操作</th></tr>';
  10. foreach ($data as $user) {
  11. $user['status'] = $user['status'] == 1 ? '正常' : '注销';
  12. $table .= '<tr>';
  13. $table .= '<td>' . $user['id'] . '</td>';
  14. $table .= '<td>' . $user['uname'] . '</td>';
  15. $table .= '<td>13800138000</td>';
  16. $table .= '<td>' . $user['status'] . '</td>';
  17. $table .= '<td><button>删除</button><button>编辑</button></td>';
  18. $table .= '</tr>';
  19. }
  20. $table .= '</table>';
  21. return $table;
  22. }
  23. }
  24. $data = (new Model)->getData();
  25. echo (new View)->fetch($data);

3、Controller.php文件

  1. <?php
  2. namespace mvc_demo;
  3. require 'Model.php';
  4. require 'View.php';
  5. class Controller
  6. {
  7. protected $model;
  8. protected $view;
  9. // 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入
  10. // 通过构造方法将外部对象初始化,实现了外部依赖注入的对象在类内部的共享/复用
  11. public function __construct(Model $model,View $view)
  12. {
  13. $this->model = $model;
  14. $this->view = $view;
  15. }
  16. // 在控制器架构方法和操作方法中,一旦对参数进行对象类型约束则会自动触发依赖注入
  17. // 在操作方法中注入
  18. public function index(Model $model,View $view)
  19. {
  20. // 1. 获取数据 Model
  21. $data = $this->model->getData();
  22. // 2. 视图渲染 View
  23. $this->view->fetch($data);
  24. }
  25. public function edit(Model $model)
  26. {
  27. $this->model->editData();
  28. }
  29. }
  30. $model = new Model;
  31. $view = new View;
  32. //echo ($new Controller($model,$view))->index($model, $view);
  33. $c = new Controller($model,$view);
  34. call_user_func_array([$c,'index'],[$model,$view]);

运行结果:


总结:

  1. `Model`:数据库类,对数据库管理、操作;
  2. `View`:视图类,对前天视图的格式化;
  3. `Controller`:控制器类,请求派发器,对用户事件进行处理
  4. - 控制方法,构造方法,调用方法,获取数据
  5. `依赖注入`:将模型和视图的实例化过程,放在控制器的外部进行实现,作为参数,注入到控制器的方法中。
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