0905 ThinkPHP 字段映射表名操作事务处理AR模式连贯操作统计函数代码调试文件载入验证码.docx
- 文档编号:26371980
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:33
- 大小:2.13MB
0905 ThinkPHP 字段映射表名操作事务处理AR模式连贯操作统计函数代码调试文件载入验证码.docx
《0905 ThinkPHP 字段映射表名操作事务处理AR模式连贯操作统计函数代码调试文件载入验证码.docx》由会员分享,可在线阅读,更多相关《0905 ThinkPHP 字段映射表名操作事务处理AR模式连贯操作统计函数代码调试文件载入验证码.docx(33页珍藏版)》请在冰豆网上搜索。
0905ThinkPHP字段映射表名操作事务处理AR模式连贯操作统计函数代码调试文件载入验证码
PHP高手之路——ThinkPHP框架(三)
目录
PHP高手之路——ThinkPHP框架(三)1
一、模型2
1、字段映射2
2、表名操作2
3、事务处理3
4、AR模式(ActiveRecord)4
5、ThinkPHP中的AR模式6
6、连贯操作7
7、统计函数7
综合案例:
实现后台登陆校检功能8
二、实用项8
1、代码调试8
1)开启Trace追踪8
2)通过getLastSql()方法查询最后执行的SQL语句9
3)通过dump()函数调试数据9
2、会话控制技术10
1)cookie:
10
2)session:
11
综合案例:
禁止后台用户翻墙行为12
3、文件载入功能13
1)函数载入功能13
2)类载入功能14
综合案例:
实现无限级分类功能15
4、验证码16
1)英文验证码16
2)中文验证码17
综合案例:
实现后台验证码功能19
综合案例:
实现后台分类修改与删除功能20
一、模型
1、字段映射$_map
ThinkPHP的字段映射功能可以让你在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能。
protected$_map=array(
//表单名(假名)=>数据表名(真名)
'cp_id'=>'c_parent_id',
'ct_id'=>'c_id',
'ct_name'=>'c_name',
'ct_description'=>'c_description'
);
分析create方法查看字段映射的具体实现思路:
系统首先对$_map这个参数进行判断,如果不为空,则进行遍历操作,然后判断表单假名是否设置,如果设置把假名获取的值信息赋值给真名,然后在实现添加操作即可。
2、表名操作
在一个数据库中,如果部署了多个项目,那么我们可以使用表前缀解决问题
‘DB_PREFIX’=>‘think_’
在ThinkPHP的模型里面,有两个关于数据表名称的属性定义
1)模型名称与实际数据表名称不一致
可以考虑使用$tableName属性进行设置(设置在自定义模型中)
如:
模型名称:
CategoryModel
表名称:
tp_categorys
//表名操作:
当表名有前缀但是除去前缀之后的表名和定义的模型名称不一致
protected$tableName="categorys";
2)如果你的表名称与其他表名称不一致或命名规则不同时
可以考虑使用$trueTableName属性进行设置(设置在自定义模型中)
如:
模型名称:
CategoryModel
表名称:
category其他表都是以tp_开头的,这种情况就需要使用$trueTableName属性
//表名操作:
当表名没有表前缀而且除去前缀之后的表名和定义的模型名称不一致
protected$trueTableName="cate";
注意:
如果不想记两个使用$trueTableName就可以
3、事务处理
1)什么是事务:
在一次操作过程中,有多个操作(写操作).需要保证的多个操作都必须成功,整个结果才能成功;如果中间有某一个步骤失败,整个结果应该失败.
2)使用事务处理有一个前提:
mysql存储引擎必须使用InnoDB
Alerttablene_categoryengine=InnoDb;
3)在ThinkPHP中也提供对事务处理的支持:
第一步:
开启事务处理
•$User->startTrans()
第二步:
如果事务处理成功,提交数据
•$User->commit()
第三步:
如果事务处理失败,则进行回滚操作
•$User->rollback()
//事务处理
publicfunctionaffairs(){
//实例化模型
$category=D('category');
//事务处理三步走
//第一步:
开启事务
$category->startTrans();
//执行业务流程
$flag=true;
//添加数据
$id=$category->add(
array(
'c_parent_id'=>'2',
'c_name'=>'事务处理',
'c_description'=>'事务处理...'
)
);
//如果添加失败,修改flag标记
if(!
$id){
$flag=false;
}
//修改数据
$id=$category->save(
array(
'c_name'=>'洗衣粉',
'c_id'=>1
)
);
//如果修改失败,修改flag标记
if(!
$id){
$flag=false;
}
//根据条件进行事务处理的后续操作
if($flag){
//事务处理成功:
同步数据
$category->commit();
}else{
//事务处理失败:
回滚之前的操作
$category->rollback();
echo"失败";exit;
}
}
4、AR模式(ActiveRecord)
在之前的学习中,我们通过定义一个数组然后通过add方法进行添加操作,这种方式我们都称之为ORM模式,今天为大家介绍一种新的开发模式——AR模式。
ORM模式与AR模式功能都是一致的,只是语法不同,在实际项目开发中,你使用ORM模式或AR模式都可以进行项目开发,讲AR模式的主要目的,是让大家多掌握一种实现模式而已。
AR模式基本原理:
1)表(数据表)映射到类(模型类)
2)表中的字段映射到类中的一个属性
3)表中每一个记录映射到一个对象中
示例代码:
在实际项目开发中,面向强调三大特性:
封装、继承、多态
public
protected
private
所以以上代码中的属性信息需要更改为如下形式:
但是如果一个属性定义为私有属性,那么在类的外部就没有办法直接访问,如果想实现对私有属性的访问以及设置操作可以采用JavaBean思想,为一个私有属性设置两个公有方法:
以上方法虽然可以解决私有属性的赋值与获取问题,但是如果系统中存在100个私有属性,那么就需要定义200个公有方法,过于繁杂,那么如何解决以上问题呢?
答:
可以通过php5中提供的魔术方法__set($name,$value)与__get($name)方法实现对私有属性的操作,这两个魔术方法的主要功能:
当我们访问一个私有属性或不存在属性时,系统会自动调用__set与__get方法进行设置。
5、ThinkPHP中的AR模式
问题:
我们模型中并没有定义过name属性、description属性或cid等相关属性呢?
为什么实现对数据的增删改查操作呢?
答:
当我们访问一个不存在的属性或方法时,系统会自动调用__set与__get魔术方法,由于我们的子类模型继承父类Model模型,所以在Model模型中肯定定义了以上两个魔术方法:
6、连贯操作
•where():
相当于sql语句中的where条件
•order():
排序功能,asc正序,desc降序
•limit():
相当于sql语句中的limit语句
•field():
筛选指定的字段信息
•group():
分组功能groupby
说明:
groupby要求分组字段必须出现在select筛选字段中且通常结合统计函数配合使用。
•find():
获取指定的某条记录,返回一维数组
•select():
获取多条记录或所有记录,返回二维数组
特别说明:
find方法与select方法必须放在连贯操作的最末端。
7、统计函数
•count():
获取数据表中总记录数
•max():
获取最大值
•min():
获取最小值
•avg():
求平均值
•sum():
求和
综合案例:
实现后台登陆校检功能
①进入./Shop/Admin/Controller/PublicController.class.php中的checkLogin方法
二、实用项
1、代码调试
1)开启Trace追踪
如果在实际项目开发中,相对输出页面进行调试,可以通过在配置文件(./Shop/Common/Conf/config.php)中添加以下参数:
开启成功,display输出页面会显示如下图标:
点击后如下图所示:
2)通过getLastSql()方法查询最后执行的SQL语句
运行结果如下:
3)通过dump()函数调试数据
原生代码中我们通常使用var_dump或print_r来调试数据,在ThinkPHP框架可以通过dump方法实现对数据的调试输出。
运行结果:
2、会话控制技术
http是无状态的,所以无法记录用户的相关信息。
cookie:
会话控制技术,保存用户信息到浏览器的客户端。
session:
会话控制技术,保存用户信息到服务器端。
相比而言:
session安全性要略高于cookie
在ThinkPHP中也提供了对会话控制技术的支持:
1)cookie:
•cookie('name','value'); :
设置cookie信息
•cookie('name','value',3600);:
设置cookie信息
•$value=cookie('name');:
获取指定的cookie信息
•cookie('name',null);:
清除指定的cookie信息
2)session:
在PHP中使用session会话控制技术有一个前提:
必须开启session_start(),这一点在ThinkPHP框架可以通过在配置文件(./Shop/Common/Conf/config.php)中添加以下参数:
SESSION_AUTO_START=>true;
在ThinkPHP中可以通过以下五个方法实现对Session操作
•session('name','value'); :
设置session信息
•$value=session('name');:
获取session信息
•session('name',null);:
清除指定的session信息
•session(null);:
清除所有session信息
•session('?
name');:
判断指定的session信息是否存在
综合案例:
禁止后台用户翻墙行为
①更改./Shop/Admin/Controller/PublicController.class.php文件中的checkLogin方法
以上代码虽然定义了session信息,但是依然无法防止用户翻墙登陆,如何解决呢?
②在./Shop/Admin/Controller文件夹下创建CommonController.class.php,代码如下:
③在ThinkPHP框架中不能直接使用构造函数,必须通过_initialize方法(相当于构造函数功能)进行实现。
//自定义构造函数:
_initialize
publicfunction_initialize(){
if(!
session('?
u_username')){
//如果session中没有用户名,遣返登陆页面
$this->redirect('Public/login');
}
}
④让后台模块中除PublicController.class.php以外的所有控制器自动继承CommonController.class.php控制器。
因为CommonController控制器中继承了Controller,所以其他类继承CommonController控制器的同时也继承了Controller,所以去掉引入核心基类控制器
如:
CategoryController.class.php
如:
IndexController.class.php
3、文件载入功能
1)函数载入功能
①方法一:
可以通过核心函数目录./Shop/Common/Common文件夹下创建一个function.php文件,系统在运行时会自动载入该文件。
②方法二:
如果文件在核心函数目录,通过配置文件实现文件的自动加载
例如:
在实际项目开发中,如果想实现文件的载入功能:
首先在./Shop/Common/Common文件夹中创建自定义载入文件
如:
mail.php,代码如下:
然后可以通过修改配置文件中的如下参数
‘LOAD_EXT_FILE’=>’要载入文件的名称’
设置完毕后,即可在项目的任一位置实现对mail文件中的函数的引用:
③方法三:
如果是在当前模块的common目录下
通过load方法载入当前模块中的相关文件(./Shop/Admin或Home模块/Common文件夹。
·语法:
load(‘@/自定义文件名称’)@代表当前模块
例如:
首先在./Shop/Admin/Common文件夹下创建文件admin.php
在项目的后台模块中可以通过load方法实现文件的载入功能:
注意:
如果公共common文件目录下的函数与模块common文件目录下的函数重名,在调用的时候会发生冲突
2)类载入功能
在中级项目中,我们开发了很多自定义类,如果想实现代码重用,可以使用如下方案:
①在项目目录(Shop)下创建Tools文件夹作为项目工具箱
②复制之前开发的类文件,放入相应的目录中,并更改命名规则如下:
类名.class.php
③在自定义类文件中定义命名空间
④在任意模块对其进行引用实例化:
运行结果:
综合案例:
实现无限级分类功能
①复制无限级分类文件tree.php到./Shop/Admin/Common文件夹下
②在CategoryController.class.php控制器中的add方法中调用getTree方法实现无限级分类
在./Shop/Admin/View/Category/add.html模板文件中设置无限级分类格式:
运行结果:
③同理,在CategoryController.class.php控制器中的add方法中调用getTree方法实现无限级分类
在./Shop/Admin/View/Category/list.html模板文件中设置无限级分类格式:
运行结果:
4、验证码
1)英文验证码
在开发过程中,经常需要使用验证码,在ThinkPHP框架可以通过如下方式创建验证码:
源代码存储于ThinkPHP/Library/Think/Verify.class.php文件中
开发过程中,可能需要定义验证,可以设置如下参数来实现验证码的定制:
'codeSet'=>'2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY':
设置显示的字符串信息
'useZh'=>false,是否使用中文验证码
'zhSet'=>'们以我到他会作时要动国产的一是工就年阶义发成部民可出能':
设置显示的中文信息
'useImgBg'=>false,是否使用图像
'fontSize'=>25,字体大小
'useCurve'=>true,//是否画混淆曲线
'useNoise'=>true,//是否添加杂点
'length'=>5,//验证码长度,默认为5个字符
'fontttf'=>'',//验证码字体,不设置随机显示
2)中文验证码
示例代码:
第一次访问时,系统并没有输出任何中文验证码,原因何在?
答:
因为ThinkPHP框架并没有放置任何中文字体,大家可以在【控制面板】【字体】复制黑体常规.ttf字体到ThinkPHP/Library/Verify/zhttfs文件夹中并改名为simhei.ttf
复制完成后放置与ThinkPHP框架中
再次访问即可:
综合案例:
实现后台验证码功能
①在./Shop/Admin/Controller/PublicController.class.php控制器中创建verify方法实现生成验证码:
②在./Shop/Admin/View/Public/login.html页面载入验证码并添加id属性
③点击刷新验证码
④在checkLogin方法中验证验证码是否合法
综合案例:
实现后台分类修改功能
1、在./Shop/Admin/View/Category/list.html文件中设置修改链接地址
2、在./Shop/Admin/Controller/CategoryController.class.php中创建edit方法实现修改功能
3、在./Shop/Admin/View/Category文件夹中复制add.html并改名为edit.html即可
①添加需要修改的分类的的信息
②把当前要修改的id添加为selected
特别说明:
在ThinkPHP存在第三个bug,当我们在condition条件中使用点号时必须在最后一个位置放置一个空格,否则系统时无法正常解析的。
建议:
如果不习惯使用以上代码方式,建议使用[]方括号形式。
4、在模板中定义隐藏表单发送要更新的id值
设置表单提交页面
5、在CategoryController.class.php控制器中定义editOk方法实现修改操作
综合案例:
实现后台分类删除功能
1、在list.html页面中定义form表单,并设置提交页面
2、在CategoryController.class.php控制器中定义del方法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 0905 ThinkPHP 字段映射表名操作事务处理AR模式连贯操作统计函数代码调试文件载入验证码 字段 映射 操作 事务处理 AR 模式 连贯 统计 函数 代码 调试 文件 载入 验证
链接地址:https://www.bdocx.com/doc/26371980.html