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

    .

  • 相关阅读:
    html标签
    正则表达式判断号码靓号类型
    power函数:求底的n次幂
    php5.3的新特性
    xml方式操作txt文件
    什么是闭包?
    php设计模式单例模式
    面试总结
    统计ip代码
    XSL语言学习
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/8679253.html
Copyright © 2020-2023  润新知