总结回顾---2
(1)AR
简介:AR模式即Active Record模式,是一个对象关系映射(ORM) 技术。每个AR 类代表一张数据表(或视图), 数据表(或视图)的字段在AR 类中体现为类的属性,一个AR实例
则表示表中的。
AR模式核心:三个映射 / 对应
AR类 == 表;(模型类关联了数据表)
AR类属性 == 表的字段;
AR类实例 == 表的记录;
AR模式在ThinkPHP中的典型应用:CURD操作
3个映射关系→类映射到表;属性映射到字段;实例映射到记录
$result = $model ->add();//返回新增记录的主键id $result = $model ->save();//返回值为影响行数 在ThinkPHP里,AR模式没有查询操作。所以这里的查询操作还是使用之前的select和find方法 $result = $model -> delete();
(2)Tp常见的辅助方法
原生SQL语句里除了目前所使用的基本操作增删改查,还有类似于group、where、order、limit等这样的字句。
ThinkPHP封装了相应的子句方法:封装的方法都在父类模型Model.class.php
where 表示限制查询的条件
limit 限制输出的条数
filed 限制输出的字段,也就是select id,name,age等类似语句
注意:下面两个方法在父类模型中不存在,方法不存在会走魔术方法__call(),利用__call()方法实现一些特殊的Model方法,而group和order在链操作方法列表,经过__cal()方法调用。实现相应方法。除此外还有alias(别名),having(限制查询条件),distinct(去重),filter(过滤)。
order 字段排序
group 按照指定字段进行分组查询,案例:查询部门表,查询出部门名称和出现的次数
public function test(){ //实例化模型 $model = M('dept'); //指定字段和分组 $model -> group('name'); $model -> field('name,count(*) as count'); // dump($model);die; //查询 $data = $model -> select(); dump($data); }
(3)连贯操作
将辅助方法全部写在一行上的写法为连贯操作
语法:$model -> where() -> limit() ->order() -> field() -> select{}
中间标红的即为辅助方法
辅助方法顺序:在连贯操作里,没有顺序要求。只要模型在头部,CURD方法在尾部即可
(4)Tp中的统计查询
ThinkPHP中系统封装了以下几个查询方法的使用,方便后期统计的使用。以下几个查询方法在父类模型中不存在,都是由魔术方法__call()生成的
包含count(),max(),min(),avg(),sum()
①count() 查询表中总的记录数(有where时表示查询指定条件的记录数)
②max() 查询某个字段的最大值
③min() 查询某个字段的最小值
④avg() 查询某个字段的平均值
⑤sum() 查询某个字段的总和
(5)thinkphp模型(M)拓展
1.创建数据对象
数据对象就是父类模型中的$this->data,AR模式的底层数据操作用到了数据对象。模型实例化之前数据对象只是空数组,后来使用了魔术方法__set设置了数据对象的值。
上述流程可以得出,使用数据对象前必须先创建数据对象。__set是设置数据对象的一种方法,但是应用时不便,设置一个属性就得设置一行代码。
因此ThinkPHP中系统封装了批量设置数据对象的方法:create方法
语法:$model->create();
2.自动验证:自定义规则,
①验证失败:
此时提交空表单,输出返回值dump($data);die;浏览器输出false。为什么是false?这里我们可以看父类模型,因为这里返回false
// 数据自动验证 if(!$this->autoValidation($data,$type)) return false;
②验证成功:如果验证成功,则返回正常数组
输出用户提示信息:$model->getError();
3.批量验证
一次性验证全部字段,需要配置成员属性
系统支持数据的批量验证功能,只需要在模型类里面设置patchValidate属性为true( 默认为false)
(6)字段映射
①映射表示对应关系
②应用场景:目前表单中的name值和数据表中的字段名一致,有一些人可能通过当前的功能和表单的name值猜测出表名字和表结构。后期可能会找到系统的漏洞,对系统进行
攻击。系统的安全性存在威胁。因此可以使用类似障眼法,将name值随机指定,这时name值和表字段不一致,那样也就猜测不出表结构了。
语法:没有语法、、、、只有规则定义$_map,与自动验证一样,在父类模型里有过定义
// 查询表达式参数 protected $_validate = array(); // 自动验证定义 protected $_map = array(); // 字段映射定义
将其复制到自定义子模型定义,
(7)特殊表的实例化操作
表没有前缀,或者表前缀不是配置文件里定义的前缀,这些都是特殊表
实例化时会将前缀和表名自动连接起来,所以会报错提示sp_szphp表不存在。
解决办法:看下父类模型文件关于数据表名的定义
// 数据表名(不包含表前缀) protected $tableName = ''; // 实际数据表名(包含表前缀) protected $trueTableName = '';//告知系统当前模型所关联的表的真实表名,且是已经包含前缀的表名
这里我们选第二个,告诉ThinkPHP,这张表名已经包含前缀了,不要再加前缀。
通过父类模型属性中的成员属性trueTableName属性,进行表名的指定。告知模型表名真实名字,让其不要再关联上前缀。
(8)会话控制
会话支持一般指cookie和session,在ThinkPHP里为了方便开发,封装了cookie和session方法。
1. session方法
在函数库封装了session方法
session('name','value') 创建一个名为name的session,值为value
$value = session('name') 读取session中的name元素值,并赋值给变量$value
session('name',null) 删除session中名为name元素的值
session(null) 删除全部session值
session() 读取全部的session信息
session('?name') 判断名为name的session元素是否存在,存在返回true,否则返回false
cookie方法
2. 在函数库封装了cookie方法
cookie('name','value') 创建一个名为name的cookie,值为value
cookie('name','value',3600) 创建一个名为name的cookie,值为value,有效期为3600s
$value=cookie('name') 读取名为name的cookie,赋值给value
cookie('name',null) 删除名为name的cookie
cookie(null) 删除所有,但是测试后发现无效。查看手册,发现该方法有BUG。若想实现,则需更改底层实现代码。需要修改底层代码
cookie() 获取全部的cookie注意:若不指定时间,则session会话结束时到期。
// 清除指定前缀的所有cookie if (is_null($name)) { if (empty($_COOKIE)) return null; // 要删除的cookie前缀,不指定则删除config设置的指定前缀 $prefix = empty($value) ? $config['prefix'] : $value; if (!empty($prefix) || $name == null) {// 如果前缀为空字符串将不作处理直接返回 foreach ($_COOKIE as $key => $val) { if (0 === stripos($key, $prefix)||$name == null) {//函数库1379行 setcookie($key, '', time() - 3600, $config['path'], $config['domain'],$config['secure'],$config['httponly']); unset($_COOKIE[$key]); } } } return null; }elseif('' === $name){ // 获取全部的cookie return $_COOKIE; }
.