控制器中获取数据时:
$act=!empty($_GET['a']) ? $_GET['a'] : "Index";
--------------------------------------------------------------------------------------
基础控制器类
1,设定编码
2,页面的简短消息(提示文字)的显示,以及跳转功能。
--------------------------------------------------------------------------------------
视图层的典型做法
功能:展示页面的静态内容,以及相关的变量数据。
数据分为:
普通标量数据:echo $v1;
数组数据:foreach($arr as $key => $value){....}
或单独输出:echo $arr[‘id’]; echo $arr[‘age’]; .....
对象数据: echo $obj->p1; echo $obj->p2;
--------------------------------------------------------------------------------------
有关MVC的其他常见做法
请求分发器(前端控制器):
在每次请求的时候,都带上“要使用的”控制器名?
如果可以,则,我们就可以将代码进一步“提升”(简化为):
$c = “User”; //它也可能是“product”,或其他。。。
require ‘./” . $c . “Model.class.php’;
require './ModelFactory.class.php'; //这个都一样,不同动
require './BaseController.class.php';//这个都一样,不同动
class XXXController extends BaseController{ ...... } //代表某个控制器,每个控制器是一个独立文件
require ‘./’ . $c . “Controller.class.php”; //这里才是需要载入的“当前控制器类”
$controller_name = $c . “Controller”; 构建控制器的类名
$ctrl = new $controller_name (); //可变类
$act = !empty($_GET['a']) ? $_GET['a'] : "Index";
$action = $act . "Action";
$ctrl->$action();
所谓的前端控制器(请求分发器):
它的作用是:
1,根据传过来的c请求数据,决定使用哪个控制器;——有默认值,目前为User
2,根据传过来的a请求数据,决定使用哪个动作(方法);——有默认值,目前为Index
而且,此时,UserController类和ProductController类中,没有其他代码了,只有“纯类”的定义代码;
--------------------------------------------------------------------------------------
前端控制器(请求分发器)
目录结构的设定:
通常,我们会将一个MVC项目中的一些一些相应的文件,分门别类存放,结果就类似这样:
MVC项目/
index.php
/Controllers/
XX1Controller.class.php
XX2Controller.class.php
.....
/Models/
XX3Model.class.php
XX4Model.class.hpp
.....
/Views/
page1.htm.
page2.html
.....
/Framework/
BaseController.class.php
BaseModel.class.php
ModelFactory.class.php
MySQLDB.class.php
--------------------------------------------------------------------------------------
基础常量的设定 19.doc
自动加载的实现
说明:
1,自动加载是指:在需要一个类的时候,自动去加载该类的对应类文件;
2,自动加载,不能自动加载“视图文件”;
禁止其他目录中文件的直接访问 19.doc
--------------------------------------------------------------------------------------
使用MVC框架,模拟ECshop的登录界面和功能
首先,要设计“登录账户表”
——就是管理员表:
create table admin_user(
id int auto_increment primary key,
admin_name varchar(20) unique key,
admin_pass varchar(48) not null,
login_times int default 0 comment '登录次数',
last_login_time datetime comment '最后登录时间'
) charset =utf8;
然后,在插入一两条数据(管理员身份)
insert into admin_user
(admin_name, admin_pass, login_times)values
('admin1', md5('123'),0 );
insert into admin_user
(admin_name, admin_pass, login_times)values
('admin2', md5('123'), 0 );
--------------------------------------------------------------------------------------
然后,开始设计界面:
将源代码拷贝过来,并相应修改一些路径。
然后,模拟实现ecshop的登录功能:
1:修改表单:19.doc
2,并且,相应地,修改Admin控制(添加对应的方法):19.doc
3,然后,继续在AdminModel类中,去添加一个方法:CheckAdmin()
--------------------------------------------------------------------------------------
PDO
PDO是别人写的“数据库操作工具类”!——它可以代替我们自己写的MySQLDB.class.php.
使用它,类似这样:
$pdo = new PDO(连接信息);
$sql = “select * from .....”;
$result = $pdo->query($sql); //返回一个“pdo结果集”;
$sql = “delete / update / insert ........ ”;
$result2 = $pdo->exec($sql); //返回一个真假值;
--------------------------------------------------------------------------------------
使用pdo连接mysql数据库
$DSN = "mysql:host=服务器地址/名称;port=端口号;dbname=数据库名";
$Opt = array(PDO::MYSQL_ATTR_INIT_COMMAND=>’set names 连接编码’);
$pdo = new pdo($DSN, "用户名", "密码", $Opt);
--------------------------------------------------------------------------------------
pdo对象的使用(常见方法)
$result = $pdo->query(“返回结果集的sql语句”); //对比最原始的函数: mysql_query(“select ..... “)
结果:
成功:就是一个pdo结果集对象(后续马上学习);
失败:false;
$result = $pdo->exec(“增删改的sql语句”);
结果: true(表示成功),false(表示失败);
$pdo = null; //销毁该对象;
--------------------------------------------------------------------------------------
其他操作:
$pdo->lastInsertId();
获取最后添加的id值;
$pdo->beginTransaction();:
开启一个事务
$pdo->commit()
提交一个事务
$pdo->rollBack();
回滚一个事务;
$pdo->inTransaction();
判断当前行是否在事务中,返回true/false
$pdo->setAttribute(属性名,属性值);
设置pdo对象的属性值;
举例:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
$pdo->begintrsaction();
$pdo->exec(“insert ....”);
$pdo->exec(“delete ....”);
$v1 = $pdo->intransaction(); //结果是true
--------------------------------------------------------------------------------------
pdo的错误处理
静默模式
默认情况下,pdo采用“静默模式”处理错误:
就是发生了错误后,并不提示,而只是返回false。我们需要在程序中去判断返回是否为fale,然后,如果是false,再去“主动”获取错误信息。——跟mysql一样!
对比mysql:
$sql = “updateeeee tab set name = ‘abc’ ; ”;
$result = mysql_query($sql); //这里,执行该sql语句,肯定出错
if( $result === false){
echo “发生错误:” . mysql_error();
}
else{......}
则对pdo来说,大致如此:
$sql = “updateeeee tab set name = ‘abc’ ; ”;
$result = $pdo->exec ($sql); //这里,执行该sql语句,肯定出错
if( $result === false){
echo “发生错误:” . $pdo->errorInfo(); //这里只是示意;
//实际情况是:$pdo->errorInfo()返回的是一个“数组”,其中的下标为3的项,才是错误提示内容
}
else{......}
--------------------------------------------------------------------------------------
异常模式
可以简单理解为:适应面向对象语法的处理错误的一种语法结构。如下所示:
try{
在这里,可以执行“可能出错”的语句(多条也可以);
一旦发生错误,就会终止当前范围的后续程序执行,
而立即跳转到catch部分——处理错误!
}
catch( Exception $e ){
//一旦发生错误,就会进入这里,此时,并会生成一个“错误对象”;
//该错误对象,就是系统类Exception的一个实例:它包含了错误信息。
}
pdo要使用异常模式,就得专门设置(因为其默认是静默模式):
--------------------------------------------------------------------------------------
pdo的结果集对象(PDOStatement)
pdo的结果集对象从哪里来?
——来自pdo对象执行“返回数据集的sql语句”并成功的时候,得到的就是pdo的结果集对象。
$stmt = $pdo->query(“select ..... “);//如果执行成功,则$stmt就是pdo的结果集对象
--------------------------------------------------------------------------------------
pdo结果集对象的常用方法
$stmt = $pdo->query(“select ...... ”);//这是获得结果集
$stmt->rowCount() ; //得到结果集的行数
$stmt->columnCount() ; //得到结果集的列数
$stmt->fetch( [返回类型] ); //从结果集中取出“一行”数据;
取出的结果,由其中的“返回类型”来决定,常用的有:
PDO::FETCH_ASSOC:表示关联数组
PDO::FETCH_NUM:表示索引数组
PDO::FETCH_BOTH:表示前二者皆有,这是默认值
PDO::FETCH_OBJ:表示对象
$stmt->fetchAll([返回类型]);一次性获取结果集中的所有数据,返回的是一个二维数组,相当于我们自己写的GetRows()
$stmt->fetchColumn( [$i] );获取结果集中的“下一行”数据的第$i个字段的值,结果是一个“标量数据”,相当于我们自己的写的:GetOneData()
$stmt->fetchObject();
$stmt->errorCode();:pdo结果集的错误代号
Back to home |
File page
Subscribe |
Register |
Login
| N