代码架构进货过程

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.php
AllowOverride All
Allow 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;//最后执行的SQL private 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->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执行失败<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');
}
}

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

<?php

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

控制器类

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

<?php

class 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();//利用了可变函数

PHP之MVC学习的更多相关文章

  1. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  2. Spring MVC 学习 -- 创建过程

    Spring MVC 学习 -- 创建过程 Spring MVC我们使用的时候会在web.xml中配置 <servlet> <servlet-name>SpringMVC< ...

  3. 前端MVC学习总结——AngularJS验证、过滤器

    前端MVC学习总结--AngularJS验证.过滤器 目录 一.验证 二.过滤器 2.1.内置过滤器 2.1.1.在模板中使用过滤器 2.1.2.在脚本中调用过滤函数 2.2.自定义过滤器 三.指令( ...

  4. 《Spring MVC学习指南》怎么样?答:书名具有很大的欺骗性

    2016年6月21日 最近,因为工作需要,我从网上买了一本<Spring MVC学习指南>,ISBN编号: 978-7-115-38639-7,定价:49.00元.此书是[美]Paul D ...

  5. PHP实例开发(3)PHP中MVC学习之ThinkPHP

    PHP中MVC学习之ThinkPHP 1.什么是MVC MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离 MVC是一个设 ...

  6. Asp.net MVC 学习系列(一)序

    题外话 公司本月开始提供早餐服务,2块天一餐,包括粥,两个包(听说是利口福供应的),一个鸡蛋.良心企业.公司原本有一个内部订餐系统,用Delphi开发的,开发的人早就走光了,也没有留下什么文档,现在项 ...

  7. MVC学习(四)几种分页的实现(3)

    在这篇MVC学习(四)几种分页的实现(2)博文中,根据URL中传入的两个参数(页码数,首页.上一页.下一页.末页的标记符)来获得对应的分页数据, 只是传入的参数太多,调用起来不太方便(标记符不能够写错 ...

  8. ASP.NET MVC学习之Ajax(完结)

    一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发aj ...

  9. ASP.NET MVC学习之视图篇(2)

    继ASP.NET MVC学习之视图(1)学习 4.HTML辅助器 虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用for ...

  10. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

随机推荐

  1. BZOJ1146——[CTSC2008]网络管理Network

    1.题目大意:就是在动态的树上路径权值第k大. 2.分析:这个就是树链剖分+树套树 #include <cstdio> #include <cstdlib> #include ...

  2. OpenCV进阶之路:神经网络识别车牌字符

    1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...

  3. pro*c添加SQLCHECK后编译报错PLS-S-00201

    如果在pro*c中调用数据库了里的函数,就需要在proc的cfg配置文件中添加一行: SQLCHECK=SEMANTICS 但是添加之后又会出现PLS-S-00201错误,原因在与添加SQLCHECK ...

  4. django的前后的结合,search搜索功能案例

    利用django的Q()功能可以很好的展开搜索功能 假设我要做个这样的搜索功能

  5. mysql “group by ”与"order by"的研究--分类中最新的内容

    这两天让一个数据查询难了.主要是对group by 理解的不够深入.才出现这样的情况这种需求,我想很多人都遇到过.下面是我模拟我的内容表我现在需要取出每个分类中最新的内容 select * from ...

  6. ionic 接触的第一个Hybrid项目

    最近需要维护一个Hybird项目,使用的是ionic,由于是第一个Hybrid项目,在这里记录下基本的知识. 先看一下ionic的最基本介绍: http://my.oschina.net/u/2275 ...

  7. UIImage 在某些控件上被放大问题

    今天用到了UISlider,想利用slider.setThumbImage(UIImage(named:"aaa"), forState: UIControlState.Norma ...

  8. string literals may have at most 255 elements

    一行中的字符超出 255 时候发生这个错误 解决方式: 一行的字符串分成两行 并 + 连接 **** 将字符串分成两个用"+"连接起来

  9. cxGrid的使用方法

    来源 http://www.cnblogs.com/djcsch2001/archive/2010/07/19/1780573.html   1.  去掉GroupBy栏 cxGrid1DBTable ...

  10. 9. javacript高级程序设计-客户端检测

    1. 客户端检测 1.1 能力检测 在编写代码之前先检测特定浏览器的能力. 1.2 怪癖检测 怪癖实际上是浏览器实现中的bug 1.3 用户代理检测 通过检测用户代理字符串来识别浏览器.用户代理字符串 ...