通过上一篇 PHP gd简单画图学习后。这篇将继续探索实现PHP图片验证码的实现。效果图如下
为什么需要验证码?
- 验证码设计。验证码一使用于用户注册和登录。主要是防止机器批量注册用户或机器频繁测试登录
此处的核心点有两个。第一是图片验证码实现。第二是如果在验证页面检验输入的验证码是否正确
首先我们先实现验证码
- 新建一个cfv(Verification Code).php文件,为单独生成验证码文件
- 创建一个150*40px的画布,以及设置需要的颜色等:
$img = imagecreatetruecolor(150,40);
$white = imagecolorallocate($img,240,241,218);
$gray = imagecolorallocate($img,100,233,12);
$orange = imagecolorallocate($img,168,170,19);
imagefill($img,0,0,$white);//填充画布
- 合并一个从0-9,a-z,A-Z数组,$arr = array_merge(range(0,9),range(a,z),range(A,Z));
- 打乱数组 shuffle($arr);
- 从数组里面取出4个,并且以" "空格连接,组成验证码需要的字符串 $str = join(" ",array_slice($arr,0,4));
- 画验证码文字到画布上 imagettftext($img,20,0,10,30,$gray,"my.TTF",$str);
imagettftext (resource$image
,float$size
,float$angle
,int$x
,int$y
,int$color
,string$fontfile
, string$text
) $image:画布 $size:字体大小 $angle:字体偏转角度 $x:字体左下x坐标 $y:字体左下y坐标 $color 字体颜色 $fontfile()在C:\Windows\Fonts下任意取一个.TTF文件$text 验证码文字
- 为了防止机器频繁测试。所以得增加干扰线 。如下增加了30条干扰线
- for ($i=0; $i <30 ; $i++) {
- imagearc($img, mt_rand(0,150), mt_rand(0,40), mt_rand(0,30), mt_rand(0,30), mt_rand(0,360), mt_rand(0,360), $orange);
- 最后画出该验证码图像,并且释放资源 imagejpeg($img); imagedestroy($img);
创建表单,这儿随便创建了一个表单。代码直接上图
最后是验证提交的表单验证码信息是否正确
- 由于我们验证的php和验证码的php文件不同,所以改怎么在验证码图片中获取文字作比较?此处停留思考1分钟^-^
- 这时候我们需要借助Session,关于Session详细运用,这儿不做深究。只略讲一下这儿的Session运用
- 开启Session session_start();需要在验证码最上面开启。注意这句代码前不能有输出比如echo......
- 把验证码字符串存入Session $_SESSION['vcode']=$str;
- 在验证的php文件中取出Session $scode = $_SESSION['vcode']
- checkrgis.php 里面需要拿到表单传入的验证码,在和Session的验证码做比较。这样即可验证。代码如下
- session_start();
- $scode = $_SESSION['vcode'];
- $pvfc = $_POST['vfc'];
- $code = strtolower(str_replace(" ","",$scode));
- $fvc = strtolower(str_replace(" ","",$pvfc));
注意:获得的用户输入的验证码和Session的验证码都需要把空格全部消除,在转小写后比较。对应上面4,5句代码
源码下载地址 https://pan.baidu.com/s/1k4xn8zdLC9yKvFEGUryN4g 提取码 st8f