Thinkphp3.2.3的学习Day4

一、ThinkPHP中的模型

1、数据对象创建
数据对象也就是父类模型中的$this -> data,上一天我们在使用AR模式的使用到了数据对象,在模型实例化的时候数据对象还是一个空数组,在后来使用了魔术方法__set来设置了数据对象的值。

从上述的一个流程中我们可以得出:既然data属性之前是空数组,后期使用的时候需要先给其赋值,也就说明,在使用数据对象的时候必须先创建数据对象。而__set是设置数据对象的一种方法;但是这种方式在使用的时候并不方便,原因是设置一个属性就得写一行代码;因此在ThinkPHP中系统还提供另外一种批量设置数据对象的方法:create方法。

这个方法在Model.class.php模型中
$model -> create();
在这里插入图片描述
通过它的实现代码,可以发现如果不给create方法传递参数,则其默认使用post中的数据。
在这里插入图片描述
在结尾的两行代码中,其做了2个操作:
第一:将处理完成的data数据赋值给了data属性,这步就是创建数据对象。
第二:将处理完成的数据返回出去。

案例:改写之前编写的部门信息入库的一个代码,使用数据对象的创建方式。
说明:如果表单中字段和数据表中字段不匹配,则在创建数据对象的时候会被过滤掉。

在这里插入图片描述
关于是否接收数据对象创建方法返回值说明:
如果想使用打印方法去查看数据是否正确则可以接收返回值,如果不想打印,则可以不接收,则在使用CURD操作的时候也不需要给具体的操作方法传递参数。如果在使用自动验证的时候,则必须要接收返回值。

2、自动验证

自动验证就是在提交数据的时候系统会按照指定的规则进行数据的有效性、合理性的验证。
上述提及到规则,系统默认是没有,如果需要使用自动验证,规则需要我们自己去定义。

在前端中javascript的验证叫前端验证,在ThinkPHP中也存在验证机制,这样的验证称之叫做后端验证。

自动验证语法:没有语法,由数据对象创建方法create方法去实现自动验证,那我们需要写的就是验证规则。
在这里插入图片描述
因为在create方法中执行了自动验证的处理,如果需使用自动验证,则必须要用数据对象创建方法进行接收数据。

那如何去定义所谓“规则”呢?
在这里插入图片描述
在父类模型中存在一个成员属性,叫做_validate,这个属性是保存验证规则的。由于不能在父类模型中直接更改属性,所以可以把这个属性复制到子类(自定义模型)中去定义规则。
在这里插入图片描述
在这里插入图片描述

必选参数:

验证字段:表单中每一个表单项的name值;

验证规则:就是针对验证字段的要求格式的限制,常见规则有require 字段必须、email 邮箱、url URL地址、
												currency 货币、number 数字。

错误提示:在验证不合理的时候给用户提示信息。

可选参数:

验证条件:0表示字段存在就验证(默认),1表示必须验证,2表示字段不为空的时候验证。

附加规则:结合验证规则,两者配合起来使用。具体支持的方法,可以参考手册“自动验证”。

验证时间:1表示新增数据的时候验证,2表示编辑的时候验证,3表示全部情况下都验证(默认)。

案例:针对部门添加功能,使用自动验证来验证字段的合法性。
说明:如果在自动验证中使用函数(function)来验证字段的合法性,则第二个参数要求是函数名(函数名要是函数是php内置的函数或者自己定义的函数《自定义函数可以是函数库中声明的也可以在当前模型中去定义》)。
在这里插入图片描述
注意:因为规则是定义在自定义模型中,所以模型在实例化的时候必须需要实例化自定义模型。

自动验证失败,则create方法返回false,如果验证成功,则返回正常的数组。
输出用户提示信息:
$model -> getError(); 这个的返回值为字符串 所以可以直接放进跳转里面实现
在这里插入图片描述

在这里插入图片描述
批量验证:
需要配置一个成员属性:patchValidate设置成true,则表示开启批量验证。
在这里插入图片描述

输出:
在这里插入图片描述

3、字段映射 (这里主要就是防范黑客的攻击)
映射就是表示一个对应关系。

应用场景:在目前表单中的name值都和数据表中的字段名都是一样的,有一些人可能通过当前功能和表单的name值猜测出数据表的名字和表结构。后期就可能会找到系统的漏洞对系统的进行功能。系统的安全性存在威胁。
因此,我们可以使用一个障眼法,将name值来随机指定,name值就和表的字段不一致,那样别人就猜测不出表的结构。

因为如果字段和数据表中的字段不匹配,在操作的时候会被系统过滤,所以需要有一个对照列表,告知系统,不对应的name值是数据表中的字段。

字段映射和自动验证一样,没有语法,只有规则定义:
成员属性:$_map = array();
在这里插入图片描述
因为成员属性是父类模型中的,所以不能在父类模型中直接修改,需要在自定义模型中定义:
在这里插入图片描述
因为数据对象中使用了字段映射的检查,所以,此处如果需要使用字段映射,则必须要使用数据对象的创建方法接收数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

打印post来的数据字段
在这里插入图片描述

4.、特殊表的实例化操作

如果我们的前缀是sp_ 但是自己却定义了一个名为sa的表名 不符合 sp_sa的名字规范 可以利用这个技术来修正

二、ThinkPHP中的实用项(2)

1、会话控制
会话支持一般都是指的是cookie和session。在php核心中有说及php对于cookie和session支持,在ThinkPHP中系统为了方便开发的使用,也封装了相应cookie和session方法。

1.1、session的支持

在ThinkPHP中系统封装了一个方法用来实现对于session的操作:session方法(定义在系统函数库文件中functions.php)。
session(‘name’,’value’)	 创建一个名为name的session值,值是value
$value = session(‘name’)	 读取session中的name元素值,值赋给value
session(‘name’,null)		删除名为name元素的值
session(null)			删除全部的session元素
session()				读取全部的session信息
session(‘?name’)		判断名为name的session元素是否存在,如果存在则返回true,如果不存在,则返回false。

案例:在方法中使用session方法session进行操作。
在这里插入图片描述
在这里插入图片描述

1.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)				删除全部的cookie(有问题)
cookie()					获取全部的cookie

注意:在上述的几个方法使用中,cookie(null)这个方法有bug,虽然手册上写了说可以删除,但是在实际使用的时候并不能达到想要的效果。如果想这个操作可以实现则需要更改底层的实现代码:
在这里插入图片描述

2、文件加载

2.1、函数库形式加载(重点) 这个也是最常见的

函数库在ThinkPHP中有三大类:系统函数库文件(functions.php)、应用级别函数库文件、分组级别函数文件。
上述三大类的文件只有系统函数库文件默认是存在的,其他两类默认不存在,需要自行创建;
上述三大类文件只有系统函数库文件名叫做functions.php,另外两大类文件名叫做function.php。

案例:使用函数库文件的形式定义需要的函数,函数名gbk2utf8
在这里插入图片描述
定义好的函数库文件中的函数,在使用的时候遵循php内置函数语法的要求,只要直接写上函数名(参数),这种形式就可以了。
在这里插入图片描述
在这里插入图片描述
说明:
第一:不需要引入function.php,系统在执行的时候自动帮我们引入了文件function.php文件;
第二:如果函数定义在应用级别的函数库文件中,则能在全部的分组(整个应用)使用;如果函数定义在某个分组的函数库文件中,则只能在当前的分组中使用,否则会报函数未定义。

2.2、通过配置项动态加载

在系统的执行流程中有 一个文件会被执行到App.class.php
在这里插入图片描述

在该方法中执行了一个load_ext_file函数。
该方法是在系统函数库文件中定义的:
在这里插入图片描述

扩展:C方法
C方法也是快速方法之一,其作用是操作ThinkPHP中的配置项:
C(name,value); 设置配置项name的值,值是value
C(name); 读取配置项name的值
C(); 读取全部的配置项

在这里插入图片描述
通过代码的阅读,可以发现配置项LOAD_EXT_FILE的配置格式应该是类似于下面这种形式:
LOAD_EXT_FILE => ‘abc,cde,efg…’
而且上述的文件应该是位于应用级别的函数库目录中。

配置项:
在应用级别的配置文件中定义配置项LOAD_EXT_FILE,引入文件info.php

在这里插入图片描述
在应用函数库文件目录中定义一个info.php
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
上述需要注意的是,同样文件在系统封装的方法中已经进行了引入,所以在使用具体的函数的时候不需要再对文件进行单独的引入,只需要像使用函数库文件的形式直接编写需要使用的函数名即传递相应的参数即可。
2.3、通过load方法加载
语法:
load(‘@/不带后缀的php文件名’);
需要注意的是,文件必须存在于分组级别的函数库目录中,并且只能用于定义的分组中。

案例:通过自己在分组目录中创建文件hello.php,然后在其中定义一个函数,然后再去使用load方法加载并且使用其中的函数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、ThinkPHP中功能类-验证码类

验证码:captcha(全自动识别机器与人类的图灵测试)。常见验证码可以分为三种:页面上的图片形式、短信验证码、语音验证码。

在ThinkPHP中,为了提高开发效率,系统封装了一个验证码类:Verify.class.php

1、介绍
方法:
构造方法:在实例化的时候可以传递一个数组,用于和其成员属性config进行合并,生成新的配置

这里的构造方法就是为了我们自己方便自定义验证码的格式
在这里插入图片描述

Check方法:校验验证码,传递参数,用户输入的验证码
在这里插入图片描述
Entry方法:输出图片,保存验证码到session中
在这里插入图片描述
2、生成常规验证码

常规验证码是指有数字+大小写字母组成的验证码。
步骤:
第一步:实例化验证码类;
第二步:输出图片;
在这里插入图片描述
在这里插入图片描述
中文验证码
1.自己在Think/Verify引入中文字体的ttf
2.‘useZh’ => false, // 使用中文验证码
配置项改为true

补充说明

关于中文验证码的几点说明:
第一:以后在实际开发的时候不到万不得已不要使用中文验证码;
第二:中文验证码需要中文字体的支持,中文字体可以在自己计算机中找到,当也可以去字体网站下载(比如说站长之家chinaz.com);
第三:使用中文验证码必须开启php的扩展mbstring。
扩展开启:打开php.ini文件,去掉扩展前的分号,保存,重启Apache:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值