通过上一篇 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