PHP之MVC学习

代码架构进货过程

one,混编

嵌入式脚本语言PHP
html与php混编的编码方式

two,显示和逻辑相分离

最后,需要将显示和逻辑的结果放在一起!
需要在 php页面,将html代码 载入才可以!

<?php
// 业务逻辑部分
// 得到数据//得到所有的比赛信息
mysql_connect('127.0.0.1:3306', 'root', '123456');
mysql_query('set names utf8');
mysql_query('use itcast');
$sql = "select p1.id as p1_id, p2.id as p2_id, m.match_time, p1.stu_name as p1_name, m.match_result, p2.stu_name as p2_name from select_match as m left join select_student as p1 on m.player_1=p1.id left join select_student as p2 on m.player_2=p2.id";
$result = mysql_query($sql);while($row=mysql_fetch_assoc($result)) {$rows[] = $row;
}//载入 负责显示的html代码
require './template/match_list.html';

模板文件
注意当前的html页面,出现:显示格式部分由html代码充当,而数据部分需要通过php来实现。数据,特指数据的展示。(数据的获得实在负责逻辑的php代码中完成)
这样的html文件,就被称之为模(mu)板文件(template)

限制用户访问php逻辑文件
办法多得是,典型的两种:

1,.htaccess
deny from all
利用Apache的对访问的控制,将某个目录设置成禁止访问。将所有的模板都放入到目录内!
注意,htaccess生效的前提是,Apache对目录开启了allowoverride :

<Directory "D:\amp\apache\htdocs\test">DirectoryIndex index.phpAllowOverride AllAllow from all     
</Directory>

2,将不允许用户访问的文件,包含模板文件,都放置文档根目录之外!
浏览器请求只能看到文档根目录下的文件。

three,处理数据(处理业务逻辑的代码),从php代码中分离

即MVC架构

mvc,项目的分层思想,指的是完成一个业务逻辑,需要三大部分,分别是:
1,具体的业务逻辑实现的部分,数据操作,称之为 M,Model,模型!
2,具体显示样式的实现部分,html+css+js,称之为 V,View,视图!
3,负责整体流程控制的部分,负责调用M和V。成为 C,Controller,控制器!

模型类
模型的处理最终都是要处理数据库的,建立一个数据库工具类

<?php
/*** mysql数据操作类*/
class MySQLDB {//属性//对象的初始化属性private $host;private $port;private $user;private $pass;private $charset;private $dbname;//运行时生成的属性private $link;private $last_sql;//最后执行的SQLprivate static $instance;//当前的实例对象/*** 构造方法* @access private** @param $params array 对象的选项*/private function __construct($params = array()) {//初始化 属性$this->host = isset($params['host']) ? $params['host'] : '127.0.0.1';$this->port = isset($params['port']) ? $params['port'] : '3306';$this->user = isset($params['user']) ? $params['user'] : 'root';$this->pass = isset($params['pass']) ? $params['pass'] : '';$this->charset = isset($params['charset']) ? $params['charset'] : 'utf8';$this->dbname = isset($params['dbname']) ? $params['dbname'] : '';//连接数据库$this->connect();//设置字符集$this->setCharset();//设置默认数据库$this->selectDB();}/*** 克隆* @access private*/private function __clone() {}/*** 获得单例对象*/public static function getInstance($params) {if (! (self::$instance instanceof self) ) {//实例化时,需要将参数传递到构造方法内self::$instance = new self($params);}return self::$instance;}/*** 连接数据库*/private function connect() {if(!$link = mysql_connect("$this->host:$this->port", $this->user, $this->pass)) {//$this->host . ':' . $this->portecho '连接失败,请检查mysql服务器,与用户信息';die;} else {//连接成功,记录连接资源$this->link = $link;}}/*** 设置字符集*/private function setCharset() {$sql = "set names $this->charset";return $this->query($sql);}/*** 设置默认数据库*/private function selectDB() {//判断是否存在一个数据库名if($this->dbname === '') {return ;}$sql = "use `$this->dbname`";return $this->query($sql);}/*** 执行SQL的方法,PHPDocumentor** @param $sql string 待执行的SQL** @return mixed 成功返回 资源 或者 true,失败,返回false*/public function query($sql) {$this->last_sql = $sql;//执行,并返回结果if(!$result = mysql_query($sql, $this->link)) {echo 'SQL执行失败<br>';echo '出错了SQL是:', $sql, '<br>';echo '错误代码是:', mysql_errno($this->link), '<br>';echo '错误信息是:', mysql_error($this->link), '<br>';die;return false;//象征性的!} else {return $result;}}/*** @param $sql string 待执行的sql* @return array 二维*/public function fetchAll($sql) {//执行if ($result = $this->query($sql)) {//成功//遍历所有数据,形成一个二维数组$rows = array();//初始化while($row = mysql_fetch_assoc($result)) {$rows[] = $row;}//释放结果集mysql_free_result($result);return $rows;  } else {//执行失败return false;}}/*** 执行SQL,获得符合条件的第一条记录** @param $sql string 待执行的SQL** @return array 一维数组*/public function fetchRow($sql) {if ($result = $this->query($sql)) {$row = mysql_fetch_assoc($result);mysql_free_result($result);return $row;} else {return false;}}/*** 利用一个SQL,返回符合条件的第一条记录的第一个字段的值** @param $sql string 待执行的SQL** @return string 执行结果*/public function fetchColumn($sql) {if ($result = $this->query($sql) ) {if ($row = mysql_fetch_row($result)) {//row返回的是索引数组,因此0元素,一定是第一列mysql_free_result($result);return $row[0];} else {return false;}} else {return false;}}/*** 在序列化时被调用** 用于负责指明哪些属性需要被序列化** @return array*/public function __sleep() {return array('host', 'port', 'user', 'pass', 'charset', 'dbname');}/*** 在反序列化时调用** 用于 对对象的属性进行初始化*/public function __wakeup() {//连接数据库$this->connect();//设置字符集$this->setCharset();//设置默认数据库$this->selectDB();}}

建立一个model父类处理数据

<?php/*** 模型的基础类*/
class Model {protected $db;//保存MySQLDB类的对象/*** 构造方法*/public function __construct() {//连接数据库$this->initLink();}/*** 初始化数据库的连接*/protected function initLink() {require './MySQLDB.class.php';$options = array('host'=>'127.0.0.1','port'=>'3306','user'=>'root','pass'=>'123456','charset'=>'utf8','dbname'=>'test');$this->db = MySQLDB::getInstance($options);//      mysql_connect('127.0.0.1:3306', 'root', '123456');
//      mysql_query('set names utf8');
//      mysql_query('use itcast');}
}

子类继承它并得到相应数据

<?phprequire_once './Model.class.php';class ClassModel extends Model {public function getList() {
//      mysql_connect('127.0.0.1:3306', 'root', '123456');
//      mysql_query('set names utf8');
//      mysql_query('use itcast');$sql = "select c.*, count(s.id) as s_count from select_class as c left join select_student as s on c.class_id=s.class_id group by c.class_id";return $this->db->fetchAll($sql);
//      $result = mysql_query($sql);
//      while($row=mysql_fetch_assoc($result)) {
//          $rows[] = $row;
//      }
//      return $rows;}
}

在Controller中调用即可

<?php//调用模型获得数据
require './ClassModel.class.php';
$model_class = new ClassModel;
$rows = $model_class->getList();//调用视图显示数据
require './template/class_view.html';

控制器的处理

每增加一个功能,都要增加一个控制器,加入模块的概念,表示操作的集合。

<?php// 班级管理模块
// 所有班级的功能,全都放在该文件中完成!$action = isset($_GET['a']) ? $_GET['a'] : 'list';if ('list' == $action) {//功能一:班级列表操作//调用模型获得数据require './ClassModel.class.php';$model_class = new ClassModel;$rows = $model_class->getList();//调用视图显示数据require './template/class_view.html';
}
elseif ('del' == $action) {//功能二:班级删除功能//删除班级的控制器//得到需要删除的ID//要利用模型,将相应的数据删除require './ClassModel.class.php';$model_class = new ClassModel;$model_class->delClass($_GET['id']);//不需要视图,直接返回列表页面即可header('Location: class_controller.php');
}
elseif ('N' == $action) {
//功能N:
}else {header('Location: class_module.php');
}

控制器类
将刚刚所完成一个控制器模块文件,升级成一个控制器类

<?phpclass ClassController {public function listAction() {//调用模型获得数据require './ClassModel.class.php';$model_class = new ClassModel;$rows = $model_class->getList();//调用视图显示数据require './template/class_view.html';}public function delAction() {require './ClassModel.class.php';$model_class = new ClassModel;$model_class->delClass($_GET['id']);//不需要视图,直接跳转返回列表页面即可header('Location: index.php?a=list');}
}

利用index.php作为程序的入口

<?php//确定当前的控制器类
$c = isset($_GET['c']) ? $_GET['c'] : 'Class';
$controller_name = $c . 'Controller';
//实例化控制器类,调用Action方法执行
//require './ClassController.class.php';
require './' . $controller_name . '.class.php';
$controller = new $controller_name;//可变类名的语法//调用?
$action = isset($_GET['a']) ? $_GET['a'] : 'list';
$action_name = $action . 'Action';
$controller->$action_name();//利用了可变函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人流程自动化崛起,中国是否准备好迎接智能自动化时代?

来源&#xff1a;亿欧智库摘要&#xff1a;机器人流程自动化&#xff08;Robotic Process Automation, RPA&#xff09;正迅速成为企业改善服务、提高效率和降低成本的关键工具。对此&#xff0c;PWC针对国内RPA市场展开了调查&#xff0c;预计未来45%的工作活动可以实现自动化…

PHP之MVC项目实战

本文主要包括以下内容 类文件自动加载 路径管理 页面跳转 注册自动加载方法 配置文件系统 cookie session 类文件自动加载 在PHP中使用别的类时&#xff0c;需要载入类文件&#xff0c;如果类很多的话&#xff0c;需要重复写很多代码&#xff0c;所以利用__autoload魔法方法…

加州伯克利大学:自动驾驶中虚拟到现实的强化学习|厚势汽车

来源&#xff1a;同济智能汽车研究所UCB 提出了虚拟场景到真实场景的翻译网络&#xff0c;解决强化学习用于自动驾驶虚拟测试中与现实测试的差异。强化学习需要大量的试错&#xff0c;而真实的自动驾驶车辆&#xff08;AV&#xff09;无法提供大量的试错为此 AV 强化学习使用虚…

Effective C++ 第二版 1)const和inline 2)iostream

条款1 尽量用const和inline而不用#define >"尽量用编译器而不用预处理" Ex. #define ASPECT_R 1.653 编译器永远不会看到ASPECT_R这个符号名, 在源码进入编译器之前, 就被预处理程序去掉, ASPECT_R 不会被加入到符号列表中; 编译报错时, 报错信息指向1.653, 让…

PHP之MVC项目实战(二)

本文主要包括以下内容 GD库图片操作 利用GD库实现验证码 文件上传 缩略图 水印 GD库图片操作 <?php$img imagecreatetruecolor(500, 300); //var_dumP($img); // //分配绿色 $green imagecolorallocate($img, 0, 0xff, 0x0); //var_dump($green);//fill $result ima…

2019年机器学习:追踪人工智能发展之路

作者&#xff5c;Hussain Fakhruddin编译&#xff5c;专知整理&#xff5c;Yingying&#xff0c;李大囧摘要&#xff1a;“智能助理”的时代已经到来了。机器学习已经成为全球数字化转型的关键要素之一 ,在企业领域&#xff0c;机器学习用例的增长在过去几年中也是显著的。预计…

PHP之MVC项目实战(三)

本文主要包括以下内容 标准错误错误处理 http操作 PDO 文件操作 标准错误错误处理 PHP在语法层面上发生的错误 两个过程&#xff1a; 触发阶段&#xff08;发生一个错误&#xff09; 处理阶段&#xff08;如何处理该错误&#xff09; 触发阶段 系统触发&#xff0c;…

价值2950亿美元的「量子霸权」,技术水平到了哪个阶段

来源&#xff1a;36Kr摘要&#xff1a;谁掌握了量子计算机&#xff0c;谁就可能引领下一次信息革命。当前经典计算体系&#xff0c;并不能解决所有问题。量子计算将给现有的计算理论带来深刻变革&#xff0c;将极大加深人类对物质与信息的理解&#xff1b;将是一种前所未有的计…

微信开发简单实例

本文主要包括以下内容 1. 微信聊天机器人 微信聊天机器人 利用图灵机器人接口实现微信聊天机器人 <?phpdefine("TOKEN", "weixin"); $wechatObj new wechatCallbackapiTest(); if (isset($_GET[echostr])) {$wechatObj->valid(); }else{$wec…

开放政府数据价值:内涵、评价与实践

来源&#xff1a;《政府数据开放研究》作者&#xff1a;陈美 湖北工业大学经济与管理学院分析开放政府数据的价值与评价&#xff0c;有助于政府数据开放更高效地开展。文章在界定开放政府数据价值内涵与层次划分的基础上&#xff0c;介绍国外开放政府数据价值评价进展&#xff…

Smarty模板技术学习

模板引擎技术&#xff1a;使得php代码和html代码分离的技术就称为“模板引擎技术” 自定义smarty模板技术实现 <?php//迷你smarty原理 class MiniSmarty{public $var_arr array();public $template_dir "./view/";public $compile_dir "./view_c/"…

vc++深入详解学习-NO.3

c的多态性&#xff0c;基于虚函数的多态性技术&#xff0c;在成员函数的定义前面加上virtual关键字申明的函数叫做虚函数&#xff0c;当c编译器在编译的时候&#xff0c;发现类中的虚函数&#xff0c;这个时候c就好采用迟邦定技术&#xff0c;在运行期间依据对象的类型确定调用…

50大产业链全景图(高清完整版)

来源&#xff1a;新材料在线摘要&#xff1a;机器人、无人驾驶、VR、光伏、核电、半导体……50大产业链全景图&#xff0c;让你一次纵观全局。&#xfeff;&#xff08;点击图片查看大图&#xff09;—1—全国各省新材料产业链全景图—2—飞机产业链全景图—3—高铁产业链全景图…

3D打印,智能砖,竹子城市……改变未来建筑业的8项技术

来源&#xff1a;资本实验室科学技术正在彻底改现代生活的方方面面&#xff0c;并且每天都在不断进步&#xff0c;没有任何减速的迹象。绝大多数行业已经并且正在受到技术进步的影响&#xff0c;并越来越接近未来。对于建筑行业而言&#xff0c;以下8种新技术将改变未来建筑业的…

Smarty模板技术学习(二)

本文主要包括以下内容 公共文件引入与继承 内容捕捉 变量调剂器 缓存 Smarty过滤器 数据对象、注册对象 与已有项目结合 公共文件引入与继承 可以把许多模板页面都用到的公共页面放到单独文件里边&#xff0c;通过模板就可以直接调用&#xff0c;类似php里边通过include指令…

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础&#xff0c;最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取&#xff0c;Zookeeper 的安装非常简单&#xff0c;下面将从单机模式和集群模式两个方面介绍 Zookeeper 的安装和配置。 单机…

AI“重造”麻省理工学院!今宣布投资10亿美元成立全新计算学院,近70年来最大结构调整...

来源&#xff1a;Deep Tech深科技摘要&#xff1a;近日&#xff0c;世界顶尖名校麻省理工学院通过学校官方网站宣布重磅消息。近日&#xff0c;世界顶尖名校麻省理工学院通过学校官方网站宣布重磅消息&#xff1a;投资 10 亿美元以引领计算机技术和人工智能技术的发展及全球影响…

经验分享:10个简单实用的 jQuery 代码片段

尽管各种 JavaScirpt 框架和库层出不穷&#xff0c;jQuery 仍然是 Web 前端开发中最常用的工具库。今天&#xff0c;向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段。 您可能感兴趣的相关文章精心挑选12款优秀 jQuery Ajax 分页插件分享60款绚丽的 jQuery 幻灯片…

PHP数据库操作

PHP实现数据库的增删改查 <?php $connmysql_connect(localhost,root,root); if(!$conn){ echo "connect failed"; exit; }$sqluse test; mysql_query($sql,$conn);//增加 $sql"insert into mytest values(null,pu,20)"; $rsmysql_query($sql,$conn);…

日本机器人实力大盘点,和Atlas的高调刷屏相比,日本机器人的默默崛起更让人忌惮...

来源&#xff1a;机器人大讲堂摘要&#xff1a;近期&#xff0c;估计全球的机器人圈都沉浸在Atlas的三连跳中无法自拔&#xff0c;刷屏的Atlas代表了美国对待科研的态度&#xff1a;我能所以全世界都得膜拜我&#xff01;近期&#xff0c;估计全球的机器人圈都沉浸在Atlas的三连…