热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MVC模式实现数据库查询(优化)

1.MVC模式实现数据库查询

1. MVC模式实现数据库查询


  • config.php

  1. php
  2. // 配置文件
  3. return [
  4. 'type' => $type ?? 'mysql',
  5. 'host' => $host ?? 'php.edu',
  6. 'dbname' => $dbname ?? 'first',
  7. 'username' => $username ?? 'root',
  8. 'password' => $password ?? 'root',
  9. 'port' => $port ?? 3306,
  10. 'charset' => $charset ?? 'utf8',
  11. ];


  • connect.php

  1. php
  2. // 数据库连接
  3. namespace mvc_test;
  4. use PDO;
  5. trait tConnect
  6. {
  7. private $config;
  8. public function db()
  9. {
  10. $this->config = require "config.php";
  11. extract($this->config);
  12. $dsn = sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$host,$dbname,$charset,$port);
  13. try {
  14. $db = new PDO($dsn,$username,$password);
  15. $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
  16. } catch (Throwable $e) {
  17. exit($e->getMessage());
  18. } catch (PDOException $e) {
  19. exit($e->getMessage());
  20. }
  21. return $db;
  22. }
  23. }


  • Model.php

  1. php
  2. // 模型
  3. namespace mvc_test;
  4. // 连接数据库
  5. require "connect.php";
  6. // 查询类
  7. class Model
  8. {
  9. use tConnect;
  10. public function getData ()
  11. {
  12. // PDO对象
  13. $pdo = $this->db();
  14. return $pdo->query("SELECT * FROM `student` LIMIT 10")->fetchAll();
  15. }
  16. }


  • View.php

  1. php
  2. namespace mvc_test;
  3. // 视图,展示数据
  4. class View
  5. {
  6. public function fetch ($data)
  7. {
  8. $table = '';
  9. $table .= '
  10. ';
  11. $table .= '
  12. ';
  13. $table .= '
  14. ';
  15. foreach ($data as $user)
  16. {
  17. $table .= '
  18. ';
  19. $table .= '
  20. ';
  21. $table .= '
  22. ';
  23. $table .= '
  24. ';
  25. $table .= '
  26. ';
  27. $table .= '
  28. ';
  29. $table .= '
  30. ';
  31. }
  32. $table .= '
  33. 用户信息表

    ';
  34. $table .= '
  35. id用户名性别年龄电话
    '.$user['id'].''.$user['username'].''.$user['sex'].''.$user['age'].''.$user['tel'].'
    '
    ;
  36. return $table;
  37. }
  38. }
  39. echo "
  40. ";


  • trait.php

  1. php
  2. namespace mvc_test;
  3. // iFacade初始化接口
  4. interface iFacade
  5. {
  6. public static function initialize ($container) ;
  7. }
  8. // 使用trait实现接口
  9. trait tFacade
  10. {
  11. protected static $container = null;
  12. public static function initialize ($container)
  13. {
  14. static::$container = $container;
  15. }
  16. }
  17. // 静态接管类成员的访问
  18. trait tMember
  19. {
  20. public static function getData ()
  21. {
  22. return static::$container->make('model')->getData();
  23. }
  24. public static function fetch ($data)
  25. {
  26. return static::$container->make('view')->fetch($data);
  27. }
  28. // 获取数据并渲染
  29. public static function res ()
  30. {
  31. return static::fetch(static::getData());
  32. }
  33. }
  34. // 服务容器接管外部对象
  35. trait tContainer
  36. {
  37. protected $instances = [];
  38. public function bind ($keyName,\Closure $process)
  39. {
  40. $this->instances[$keyName] = $process;
  41. }
  42. public function make ($keyName,$params=[])
  43. {
  44. return call_user_func_array($this->instances[$keyName],[]);
  45. }
  46. }


  • controller.php

  1. php
  2. namespace mvc_test;
  3. require 'Model.php';
  4. require 'View.php';
  5. require 'trait.php';
  6. // 服务容器
  7. class Container
  8. {
  9. use tContainer;
  10. }
  11. // 将外部对象添加进服务容器
  12. $container = new Container();
  13. $container->bind('model',function(){
  14. return new Model();
  15. });
  16. $container->bind('view',function(){
  17. return new View();
  18. });
  19. // Facade接管服务容器,真正实现接口
  20. abstract class Facade implements iFacade
  21. {
  22. use tFacade;
  23. }
  24. // 接管类成员的访问
  25. class Member extends Facade
  26. {
  27. use tMember;
  28. }
  29. // 控制器类
  30. class Controller
  31. {
  32. // Facade初始化
  33. public function __construct ($container)
  34. {
  35. Facade::initialize($container);
  36. }
  37. // 获取并渲染数据
  38. public function index ()
  39. {
  40. return Member::res();
  41. }
  42. }
  43. // 客户端调用
  44. $controller = new Controller($container);
  45. echo $controller->index();


2. 总结

如果在一个类中实例化另一个类,会造成依赖性过强,也就是耦合度过高,为解决这一问题,使用依赖注入的方式来解耦,但是当依赖注入的外部对象很多时,便可以使用服务容器将外部对象封装起来,进行统一管理,在此基础之上,使用Facade门面技术,接管服务容器中外部对象成员的访问,进而,以后在控制器中调用时就可以统一使用Facade类来调用,不需要担心该使用其他类来调用,因为那些类实例放入服务容器以后,类成员的访问已经被Facade接管了


推荐阅读
  • 数据库锁的分类和应用
    本文介绍了数据库锁的分类和应用,包括并发控制中的读-读、写-写、读-写/写-读操作的问题,以及不同的锁类型和粒度分类。同时还介绍了死锁的产生和避免方法,并详细解释了MVCC的原理以及如何解决幻读的问题。最后,给出了一些使用数据库锁的实际场景和建议。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 在使用dedecms过程中,添加自定义字段变量很有用,但删除并不容易。本文介绍了两种常用的删除方法:执行SQL语句和手动SQL删除。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
刘哥2502908157
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有