验证码如果不用插件,纯粹自己手写是一个很麻烦的东西,然而既然ThinkPHP已经封装好这个功能,现实起来就几行代码,那么就笑纳了。
下面将展示如下图的功能:
判断用户输入的验证码是否正确,点击图片可以刷新验证码。
这一页的代码就是如此简单:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>验证码</title>
</head>
<body>
<h1>看不清楚验证码,点击图片刷新</h1>
<form action="__URL__/validation" method="post">
请输入右图的4位英文+数字:<input type="text" name="en_input" /><img src="__URL__/en_verifyProduce" οnclick="renew_verification(this,0)"/><br/>
请输入左图的2个汉字:<input type="text" name="cn_input" /><img src="__URL__/cn_verifyProduce" οnclick="renew_verification(this,1)"/><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
<script>
//刷新验证码的JS
function renew_verification(obj,en_cn){
switch(en_cn){
case 0:
obj.src="__URL__/en_verifyProduce?random="+Math.random();
//这里用TP的Get方法写成__URL__/verifyProduce/random/"+Math.random();也是没问题的
//加个随机数防止验证码出现缓存问题
break;
case 1:
obj.src="__URL__/cn_verifyProduce?random="+Math.random();
break;
}
}
</script>
实质上,这一样就是一个简单的表单,验证码是通过ThinkPHP名为en_verifyProduce与cn_verifyProduce,功能分别为产生英文与字符验证码与中文验证码的Action所生成的图片,用户输入的验证码将通过表单的post方法,输送到名为validation这个Action判断是否输入比对。
对于VerifyAction.class.php的代码则如下:
<?php
class VerifyAction extends Action{
public function index(){
$this->display();
}
//验证码产生方法
public function en_verifyProduce(){
import("ORG.Util.Image");
Image::buildImageVerify(4,5,"png",50,25,"en_verification");
}
//中文验证码产生方法
public function cn_verifyProduce(){
import("ORG.Util.Image");
Image::GBVerify(2,"png",100,50,'msyhbd.ttf',"cn_verification");
}
//判断验证码是否输入正确
public function validation(){
if(md5($_POST["en_input"])!=$_SESSION["en_verification"]){
$this->error("英文验证码错误!");
}
if(md5($_POST["cn_input"])!=$_SESSION["cn_verification"]){
$this->error("中文验证码错误!");
}
$this->success("验证成功!");
}
}
?>
有几点需要郑重说明的:
(1)对比与产生英文验证码就是一个函数,配合如下图的几个参数(按左到右排序):
中文验证码除了如下的参数需要明白以外,
还需要将你中文验证码的产生字符文件拷贝到(ThinkPHP完整包的位置)\Extend\Library\ORG\Util这个位置,同时重启服务器,将你拷贝的字符文件加载到ThinkPHP。ThinkPHP没有附带任何字体的,你不搞个字符文件,虽然默认是simhei.ttf,然而ThinkPHP目录下并没有“黑体”这个字符文件,是产生不了中文验证码的。
这里我就使用了Win7的“微软雅黑”字体,字体文件在C:\Windows\Fonts就是一堆你系统存在的字体。至于为何产生的验证码在中文后面有几个点,这没办法了,貌似所有ThinkPHP产生的中文验证码都这吊样。大家也别太黑心,别让用户输个验证码都输得不爽,验证码长度一般中文就两个汉字就好了。
实质上,产生验证码就是ThinkPHP中扩展库的功能,这东西如果你安装ThinkPHP的核心包而不是完整包是没有的,其实完整包也不大,就1M。比隔壁Javaweb的一个包还小。这就不吐槽了。呵呵。
(2)ThinkPHP产生验证码同时,会将正确的验证码,也就是答案,压到Session里面,其中Session的名称你可以根据上两表相应的参数设置。
唯一值得注意的是,用户输入的信息,请通过md5加密,才与正确的验证码比对,因为正确的验证码自动通过md5加密。
不要以为md5又要引入什么包。这又不是Javaweb,C#什么的。md5加密函数就是PHP本身就封装好的函数。
实质上,就是POST拿到用户输入的比对,再比对早已被压在Session的验证码而已。
就是如此简单的一个过程。
不用ThinkPHP也可以参考这样的写法。