thinkphp 验证码 (2)

ThinkPHP 验证码

ThinkPHP 内置了验证码的支持,可以直接使用。要使用验证码,需要导入扩展类库中的 ORG.Util.Image 类库和 ORG.Util.String 类库。

验证码方法

我们通过在在模块类中增加一个 verify 方法来用于显示验证码,最简单的例子:

Public function verify(){
    // 导入Image类库
    import("ORG.Util.Image");
    Image::buildImageVerify();
}

import 方法是 ThinkPHP 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。如果已经将 Image 类库拷贝到了当前项目下,如 Lib/ORG 下,则可以以:

import("@.ORG.Util.Image");

import 方法是 ThinkPHP 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。

访问验证码

可以直接在浏览器里访问该验证码方法以确定验证码是否能正常显示:

http://127.0.0.1/index.php/Public/verify

如果一切正常,显示验证码如下所示:

ThinkPHP验证码示例

表单中使用验证码

在表单页面中使用验证码,是以 html img标签 来调用:

<input type="text" name="verify">
<img id="verifyImg" src="__URL__/verify" onClick="changeVerify()" title="点击刷新验证码"/>

src 属性值即为验证码方法访问地址,视实际情况不同而不同。

验证码刷新

当点击验证码图片时,触发 JavaScript changeVerify() 函数重新读取验证码,从而实现验证码刷新。该函数参考如下:

<script language="JavaScript">
function changeVerify(){
 var timenow = new Date().getTime();
 document.getElementById('verifyImg').src='__URL__/verify/'+timenow;  
}
</script>

验证码验证

在调用验证码 verify 的时候,buildImageVerify 会记录本次验证码的 MD5 信息。在表单验证操作里,以如下方法来检查验证码是否正确:

if($_SESSION['verify'] != md5($_POST['verify'])) {
    $this->error('验证码错误!');
}

其中 $_SESSION['verify'] 中的 verify 名称为 buildImageVerify 方法默认 SESSION 注册名称,具体见 buildImageVerify 语法。

使用其他风格验证码

buildImageVerify 方法生成验证码时,根据不同参数,可以生成不同风格的验证码。

buildImageVerify()

buildImageVerify 方法语法如下:

buildImageVerify(length, mode, type, width, height, verifyName)

 参数说明: 
参数说明
length验证码字符个数,默认为 4 位。
mode验证码字符类型,默认为数字。其他支持类型有:0字母 1数字 2大写字母 3小写字母 4中文 5混合(去掉了容易混淆的字符oOLl和数字01)。
type验证码的图片类型,默认为 png 。
width验证码图片的宽度,默认根据验证码长度自动计算。
height验证码图片的高度,默认为 22px 。
verifyName验证码的 SESSION 注册名称,默认为 verify 。

因此可以根据参数构造出其他风格的验证码,如:

// 5位数字
Image::buildImageVerify(5);
// 5位大写字母
Image::buildImageVerify(5, 2);
// 6位大小写字母与数字混合
Image::buildImageVerify(6, 5);

 

中文验证码

buildImageVerify 方法不支持中文验证码的显示,要使用中文验证码,需要使用 GBVerify 方法。

buildImageVerify()

buildImageVerify 方法语法如下:

GBVerify(length, type, width, height, fontface, verifyName)

 参数说明: 
参数说明
length验证码字符个数,默认为 4 位。
type验证码的图片类型,默认为 png 。
width验证码图片的宽度,默认根据验证码长度自动计算。
height验证码图片的高度,默认为 50px 。
fontface使用的字体文件,使用包含路径的完整文件名或者将字体文件放到图像类(Image.class.php)同目录下,默认使用的字体文件是 simhei.ttf (存在于 windows 的 Fonts 目录下)。
verifyName验证码的 SESSION 注册名称,默认为 verify 。

例子:

Public function verify(){
    import("ORG.Util.Image");
    Image::GBVerify();
}

如果一切正常,验证码显示如下:

ThinkPHP中文验证码示例

如果数字英文的验证码能正常显示而不能显示中文验证码,那很可能是没有读取到正确的字体文件。将 simhei.ttf 文件拷贝至 Image.class.php 同目录(ThinkPHP目录/Lib/ORG/Util/)下即可。

ThinkPHP 验证码目前不支持大小写英文混合(无数字)以及中英文混合的验证码。



应用实例:

HTML+JavaScript代码:

<script type="text/javascript"> function changeVerify(obj){ var timenow = new Date().getTime(); obj.src = obj.src+'&time='+timenow; } </script>

<table border="0" cellspacing="0" style="text-align:left;"> <tr> <td style="text-align:right;">生成图片验证码:</td><td><img src="__URL__/ImageVerify?type=1" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> <tr> <td style="text-align:right;">中文验证码:</td><td><img src="__URL__/ImageVerify?type=2" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> <tr> <td style="text-align:right;">生成高级图像验证码:</td><td><img src="__URL__/ImageVerify?type=3" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> <tr> <td style="text-align:right;">生成UPC-A条形码:</td><td><img src="__URL__/ImageVerify?type=4" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> <tr> <td style="text-align:right;">根据给定的字符串生成图像:</td><td><img src="__URL__/ImageVerify?type=5" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> </table>

PHP代码:

//验证码 function ImageVerify(){ import("@.ORG.Util.Image"); $type = isset($_GET['type'])?intval($_GET['type']):1; switch($type){ case 1: Image::buildImageVerify(); //生成图片验证码 break; case 2: Image::GBVerify(); //中文验证码 break; case 3: Image::showAdvVerify(); //生成高级图像验证码 break; case 4: $verify = self::GetRandChar(11); Image::UPCA($verify); //生成UPC-A条形码 break; case 5: $verify = self::GetRandChar(); Image::buildString($verify); //根据给定的字符串生成图像 break; } } //生成指定长度的验证码 function GetRandChar($length = 4){ $str = '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ'; $result = ''; $l = strlen($str)-1; $num=0; for($i = 0;$i < $length;$i ++){ $num = rand(0, $l); $a=$str[$num]; $result =$result.$a; } return $result; }

生成效果显示:
ThinkPHP 验证码详解及实例 - 人生若只如初见 - 云之初的博客
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值