php实现的Captcha验证码类实例
本文实例讲述了php实现的Captcha验证码类,在php程序设计中有着极其广泛的应用。分享给大家供大家参考。具体方法如下:
验证码类文件如下:
<?php /**Captcha验证码类 *Date:2011-02-19 *Author:fdipzone */ classCaptcha{//classstart private$sname=''; publicfunction__construct($sname=''){//$snamecaptchasessionname $this->sname=$sname==''?'m_captcha':$sname; } /**生成验证码图片 *@paramint$length验证码长度 *@paramArray$param參數 *@returnIMG */ publicfunctioncreate($length=4,$param=array()){ Header("Content-type:image/PNG"); $authnum=$this->random($length);//生成验证码字符. $width=isset($param['width'])?$param['width']:13;//文字宽度 $height=isset($param['height'])?$param['height']:18;//文字高度 $pnum=isset($param['pnum'])?$param['pnum']:100;//干扰象素个数 $lnum=isset($param['lnum'])?$param['lnum']:2;//干扰线条数 $this->captcha_session($this->sname,$authnum);//将随机数写入session $pw=$width*$length+10; $ph=$height+6; $im=imagecreate($pw,$ph);//imagecreate()新建图像,大小为x_size和y_size的空白图像。 $black=ImageColorAllocate($im,238,238,238);//设置背景颜色 $values=array( mt_rand(0,$pw),mt_rand(0,$ph), mt_rand(0,$pw),mt_rand(0,$ph), mt_rand(0,$pw),mt_rand(0,$ph), mt_rand(0,$pw),mt_rand(0,$ph), mt_rand(0,$pw),mt_rand(0,$ph), mt_rand(0,$pw),mt_rand(0,$ph) ); imagefilledpolygon($im,$values,6,ImageColorAllocate($im,mt_rand(170,255),mt_rand(200,255),mt_rand(210,255)));//设置干扰多边形底图 /*文字*/ for($i=0;$i<strlen($authnum);$i++){ $font=ImageColorAllocate($im,mt_rand(0,50),mt_rand(0,150),mt_rand(0,200));//设置文字颜色 $x=$i/$length*$pw+rand(1,6);//设置随机X坐标 $y=rand(1,$ph/3);//设置随机Y坐标 imagestring($im,mt_rand(4,6),$x,$y,substr($authnum,$i,1),$font); } /*加入干扰象素*/ for($i=0;$i<$pnum;$i++){ $dist=ImageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));//设置杂点颜色 imagesetpixel($im,mt_rand(0,$pw),mt_rand(0,$ph),$dist); } /*加入干扰线*/ for($i=0;$i<$lnum;$i++){ $dist=ImageColorAllocate($im,mt_rand(50,255),mt_rand(150,255),mt_rand(200,255));//设置线颜色 imageline($im,mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph),$dist); } ImagePNG($im);//以PNG格式将图像输出到浏览器或文件 ImageDestroy($im);//销毁一图像 } /**检查验证码 *@paramString$captcha验证码 *@paramint$flag验证成功后0:不清除session1:清除session *@returnboolean */ publicfunctioncheck($captcha,$flag=1){ if(empty($captcha)){ returnfalse; }else{ if(strtoupper($captcha)==$this->captcha_session($this->sname)){//检测验证码 if($flag==1){ $this->captcha_session($this->sname,''); } returntrue; }else{ returnfalse; } } } /*产生随机数函数 *@paramint$length需要随机生成的字符串數 *@returnString */ privatefunctionrandom($length){ $hash=''; $chars='ABCDEFGHIJKLMNPQRSTUVWXYZ23456789'; $max=strlen($chars)-1; for($i=0;$i<$length;$i++){ $hash.=$chars[mt_rand(0,$max)]; } return$hash; } /**验证码session处理方法 *@paramString$namecaptchasessionname *@paramString$value *@returnString */ privatefunctioncaptcha_session($name,$value=null){ if(isset($value)){ if($value!==''){ $_SESSION[$name]=$value; }else{ unset($_SESSION[$name]); } }else{ returnisset($_SESSION[$name])?$_SESSION[$name]:''; } } }//classend ?>
demo示例程序如下:
<?php session_start(); require_once('Captcha.class.php'); $obj=newCaptcha($sname);#创建Captcha类对象 #$sname为保存captcha的sessionname,可留空,留空則为'm_captcha' $obj->create($length,$param);#创建Captcha并输出图片 #$length为Captcha长度,可留空,默认为4 /*$param=array( 'width'=>13captcha字符宽度 'height'=>18captcha字符高度 'pnum'=>100干扰点个数 'lnum'=>2干扰线条数 ) 可留空 */ $obj->check($captcha,$flag);#检查用户输入的验证码是否正确,trueorfalse #$captcha为用户输入的验证码,必填 #$flag可留空,默认为1 #1:当验证成功后自动清除captchasession #0:挡验证成功后不清除captchasession,用于ajax检查 ?>
相信本文所述对大家php程序设计的学习有一定的借鉴价值。