博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP之MVC学习
阅读量:4616 次
发布时间:2019-06-09

本文共 6357 字,大约阅读时间需要 21 分钟。

代码架构进货过程

one,混编

嵌入式脚本语言PHP

html与php混编的编码方式

two,显示和逻辑相分离

最后,需要将显示和逻辑的结果放在一起!

需要在 php页面,将html代码 载入才可以!

模板文件

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

限制用户访问php逻辑文件

办法多得是,典型的两种:

1,.htaccess

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

DirectoryIndex index.php AllowOverride All Allow from all

2,将不允许用户访问的文件,包含模板文件,都放置文档根目录之外!

浏览器请求只能看到文档根目录下的文件。

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

即MVC架构

mvc,项目的分层思想,指的是完成一个业务逻辑,需要三大部分,分别是:

1,具体的业务逻辑实现的部分,数据操作,称之为 M,Model,模型!
2,具体显示样式的实现部分,html+css+js,称之为 V,View,视图!
3,负责整体流程控制的部分,负责调用M和V。成为 C,Controller,控制器!

模型类

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

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->port echo '连接失败,请检查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执行失败
'; echo '出错了SQL是:', $sql, '
'; echo '错误代码是:', mysql_errno($this->link), '
'; echo '错误信息是:', mysql_error($this->link), '
'; 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父类处理数据

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'); }}

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

db->fetchAll($sql);// $result = mysql_query($sql);// while($row=mysql_fetch_assoc($result)) {
// $rows[] = $row;// }// return $rows; }}

在Controller中调用即可

getList();//调用视图显示数据require './template/class_view.html';

控制器的处理

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

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');}

控制器类

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

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作为程序的入口

$action_name();//利用了可变函数

转载于:https://www.cnblogs.com/jjx2013/p/6223595.html

你可能感兴趣的文章
DynamicReports
查看>>
解决“System.Data.OracleClient需要Oracle客户端软件8.1.7或更高版本”
查看>>
什么是线程同步,什么是线程异步?同步的好处与弊端
查看>>
图片拉伸方法以及修改图片渲染模式以及如何把一个控制器包装成一个导航控制器...
查看>>
信息安全系统设计基础实验一:开发环境的熟悉
查看>>
【BZOJ 4199】[Noi2015]品酒大会 后缀自动机+DP
查看>>
JS将秒换成时分秒实现代码 [mark]
查看>>
Android 面试基础
查看>>
TCP/IP详解之:ARP协议 和 RARP协议
查看>>
POSIX线程
查看>>
ansible基础及使用示例
查看>>
类型转换的那些事
查看>>
iOS: sqlite数据库的基本操作
查看>>
Silverlight图表开源项目-OxyPlot
查看>>
OPENCV学习笔记2-6_简单的图像运算
查看>>
bash随笔
查看>>
"%s"
查看>>
jquery刷新页面
查看>>
杭电1096
查看>>
Oracle中的 UPDATE FROM 解决方法
查看>>