ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

时间:2022-09-24 16:16:10

一、验证码

  ThinkPHP提供了两种类型的验证码,英文验证码中文验证码

  要使用验证码,需要导入扩展类库中的ORG.Util.Image类库和ORG.Util.String类库(因为图像处理类Image类等并不是系统的核心类,在使用的时候系统并不会自动加载,需要手动用import()函数导入)。我们通过在模块中增加一个verify动作来用于显示验证码!由于获取验证码的动作并不是只有某一个模块来需要用到的,而是很多模块都需要用到,所以最好将verify动作写到一个Common模块中,已便于各个模块使用!

  ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  1、import()函数(类库导入)

  ThinkPHP模拟了Java的类库导入机制,统一采用import()函数进行类文件的加载。import方法是ThinkPHP内建的类库和文件导入方法,提供了方便和灵活的文件导入机制,完全可以替代PHP的require和include方法

    ·自动识别导入类文件的位置

    ThinkPHP的约定ThinkPHP、ORG、Com包的导入以系统基类库(即系统目录->Lib目录)为相对起始路径。如果在导入时指定了应用名称,则以应用类库(应用目录->Lib目录)为相对起始路径!

      #举个两个栗子

      系统  

      ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

      应用

      ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

      #对于导入应用类库文件,通常是在当前应用下导入当前应用的类库文件,所以这种情况下,可以将应用名称@代替!这样做有两个好处,一个是看起来更加简明,另一个就是便于移植

    ·目录名和类库名要注意大小写

    因为在Unix或Linux系统中是严格区分大小写的

    ·缓存和检测机制

    如果导入两个相同的类库文件,则会提示冲突并终止执行!注意,即使是不同目录下的相同类库文件名的文件,ThinkPHP也会认为是相同的类库文件,根本原因在与ThinkPHP默认为类库文件名与类名是一样的,一个php文件中肯定不能存在两个相同的类滴嘛!

      #举个栗子

      ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

      以上导入会提示冲突并终止执行!!!

    ·当前应用导入其它应用的类库文件

    注意,必须保证两个当前应用与其它应用是平级的

    ·类库文件名具有三个及以上.号时,需要用#号替换这些.号

    按照ThinkPHP约定的规则,.号是要被转化成正斜杠的,即导入User.Info.class.php这个类库文件时,如果用import("ORG.User.Info");的话,那么就会出错,因为ThinkPHP会认为是导入ORG/User/Info.class.php类库文件。所以得采用import("ORG.User#Info");才能正确导入

    ·从第一点可以看出,import可以自动识别导入文件的位置,但是如果想自定义导入文件的位置,那么要用到import()函数的第二个参数$baseUrl!

      #举个栗子

      导入当前目录下的RBAC/AccessDecisionManager.class.php 文件,可以如下操作

      ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  2、英文验证码

  buildImageVerify($length,$mode,$type,$width,$height,$verifyName)方法的各个参数含义

    ·length

    验证码的长度,默认为4位数

    ·mode

    验证码字符串的类型,默认为纯数字,其他支持类型有0(字母)、1(数字)、2(大写字母)、3(小写字母)、4(中文)、5(混合,去掉了容易混淆的字符oOLi和01)

    ·type

    验证码的图片类型,默认为png

    ·width

    验证码的宽度,默认会自动根据验证码的长度自动计算

    ·height

    验证码的高度,默认为22

    ·verifyName 

    验证码SESSION的记录名称,默认为verify

  注意,在SESSION中保存的是经过md5加密之后的验证码,所以在动作中进行验证码的验证时,也要对POST过来的验证码进行md5计算之后再与SESSION中的进行比对

  3、中文验证码

  buildImageVerify不支持中文验证码的显示,如果需要显示中文验证码,得使用GBVerify()方法,各参数含义

    ·length

    验证码的长度,默认为4

    ·type

    验证码图片类型,默认为png

    ·width

    验证码的宽度,默认为自动根据验证码的长度自动计算

    ·height

    验证码的高度,默认为50

    ·fontface

    使用的字体文件,使用完整的文件路径名或者直接将所用的字体文件放到图像类所在目录下,默认使用的字体文件是simhei.ttf(该文件可以中window的Fonts目录中找到)

    ·verifyName

    验证码SESSION的记录名称,默认为verify

  注意几个小点

    ·Image.class.php中用到的msubstr()并不是PHP的函数,而是ThinkPHP扩展库中String.class.php中的一个静态方法,所以要将Image.class.php中的msubstr()改为String::msubstr()

    ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

    ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

    ·GBVerify()方法中的$fontface参数默认为'simhei.ttf',所以如果不填写fontface,则必须将simhei.ttf字体文件放到Image.class.php所在目录中

    ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

    ·字体文件可以在C:/Windows/Fonts目录下拷贝,在Win10中,simhei.ttf就是如下字体

    ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  4、如果无法正确显示验证码,可以从如下几个方面进行检查

    ·PHP是否安装GD库支持

    ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

    ·在生成验证码的动作中在输出生成验证码之前是否有其它输出(特别注意UTF8的BOM头信息输出)

    ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

    ·Image类库是否正确导入

    ·如果是中文验证码,则检查是否拷贝了字体文件

二、分页

  通常在数据查询后都会对数据集进行分页操作,ThinkPHP提供了分页类来对数据分页提供支持!分页类位于扩展类库中,需要先通过import()函数导入才能用!

  1、在ThinkPHP中,分页通常有两种方式

    ·利用Page类和limit()方法

    ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

    ·利用Page类和page()方法

    ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  2、带入查询条件

  如果是POST方式查询,如何确保分页之后能保持原先的查询条件呢?可以给Page类传入参数,即给Page类的parameter属性赋值

  ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  3、分页样式定制

  通过Page类的setConfig()方法

  ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  默认值分别为

  ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  特别说一下theme,自定义theme可以设计出各种样式的分页导航条,举个简单的例子如下

  ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】

  对于分页导航条的实现,Page类的show()方法最后一步替换是关键

  ThinkPHP教程_PHP框架之ThinkPHP(十一)【验证码与分页】