总结回顾---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;
    }

 

 

 

.

posted @ 2018-03-30 23:19  剑仙6  阅读(132)  评论(0编辑  收藏  举报
欢迎访问个人网站www.qingchun.在线