一个经典的PHP验证码类分享
我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode。将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中。只要在创建对象时,为构造方法提供三个参数,包括创建验证码图片的宽度、高度及验证码字母个数,就可以成功创建一个验证码类的对象。该类的声明代码如下所示:
<?php classVcode{ private$width;//宽 private$height;//高 private$num;//数量 private$code;//验证码 private$img;//图像的资源 //构造方法,三个参数 function__construct($width=80,$height=20,$num=4){ $this->width=$width; $this->height=$height; $this->num=$num; $this->code=$this->createcode();//调用自己的方法 } //获取字符的验证码,用于保存在服务器中 functiongetcode(){ return$this->code; } //输出图像 functionoutimg(){ //创建背景(颜色,大小,边框) $this->createback(); //画字(大小,字体颜色) $this->outstring(); //干扰元素(点,线条) $this->setdisturbcolor(); //输出图像 $this->printimg(); } //创建背景 privatefunctioncreateback(){ //创建资源 $this->img=imagecreatetruecolor($this->width,$this->height); //设置随机的背景颜色 $bgcolor=imagecolorallocate($this->img,rand(225,255),rand(225,255),rand(225,255)); //设置背景填充 imagefill($this->img,0,0,$bgcolor); //画边框 $bordercolor=imagecolorallocate($this->img,0,0,0); imagerectangle($this->img,0,0,$this->width-1,$this->height-1,$bordercolor); } //画字 privatefunctionoutstring(){ for($i=0;$i<$this->num;$i++){ $color=imagecolorallocate($this->img,rand(0,128),rand(0,128),rand(0,128)); $fontsize=rand(3,5);//字体大小 $x=3+($this->width/$this->num)*$i;//水平位置 $y=rand(0,imagefontheight($fontsize)-3); //画出每个字符 imagechar($this->img,$fontsize,$x,$y,$this->code{$i},$color); } } //设置干扰元素 privatefunctionsetdisturbcolor(){ //加上点数 for($i=0;$i<100;$i++){ $color=imagecolorallocate($this->img,rand(0,255),rand(0,255),rand(0,255)); imagesetpixel($this->img,rand(1,$this->width-2),rand(1,$this->height-2),$color); } //加线条 for($i=0;$i<10;$i++){ $color=imagecolorallocate($this->img,rand(0,255),rand(0,128),rand(0,255)); imagearc($this->img,rand(-10,$this->width+10),rand(-10,$this->height+10),rand(30,300),rand(30,300),55,44,$color); } } //输出图像 privatefunctionprintimg(){ if(imagetypes()&IMG_GIF){ header("Content-type:image/gif"); imagegif($this->img); }elseif(function_exists("imagejpeg")){ header("Content-type:image/jpeg"); imagegif($this->img); }elseif(imagetypes()&IMG_PNG){ header("Content-type:image/png"); imagegif($this->img); }else{ die("NoimagesupportinthisPHPserver"); } } //生成验证码字符串 privatefunctioncreatecode(){ $codes="3456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY"; $code=""; for($i=0;$i<$this->num;$i++){ $code.=$codes{rand(0,strlen($codes)-1)}; } return$code; } //用于自动销毁图像资源 function__destruct(){ imagedestroy($this->img); } }
在上面的脚本中,虽然声明验证码类Vcode的代码比较多,但细节都被封装在类中,只要直接输出对象,就可以向客户端浏览器中输出幅图片,并可以在浏览器表单中使用。另外本类自动获取验证码图片中的字符串,促成在服务的$_SESSION["code"]中。在提交表单时,只有用户在表单中输入验证码图片上显示的文字,并和服务器中保留的验证码字符串完全相同时,表单才可以提交成功。(注意:验证码在服务器端在$_SESSION["code"]中,所以必须开启session会话才能使用该类,)
在下面的脚本code.php中,使用session_start()开启用户会话控制,然后包含验证码类Vcode所在文件vcode.class.php,创建该类对象并直接输出。就可以将随机生成的验证码图片发送出去,同时会自动将这个验证码字符串保存在服务器中一份。代码如下所示:
<?php //开启session session_start(); include"vcode.class.php"; //构造方法 $vcode=newVcode(80,30,4); //将验证码放到服务器自己的空间保存一份 $_SESSION['code']=$vcode->getcode(); //将验证码图片输出 $vcode->outimg(); ?>
表单代码如下所示:
<?php session_start(); if(isset($_POST['dosubmit'])){ if(strtoupper($_SESSION['code'])==strtoupper($_POST['code'])){ echo"输入成功!<br>"; }else{ echo"输入不对!<br>"; } } ?> <body> <formaction="reg.php"method="post"> username:<inputtype="text"name="username"><br> password:<inputtype="password"name="password"><br> code:<inputtype="text"onkeyup="if(this.value!=this.value.toUpperCase())this.value=this.value.toUpperCase()"size="6"name="code"> <imgsrc="code.php"onclick="this.src='code.php?'+Math.random()"/><br> <inputtype="submit"name="dosubmit"value="登录"><br> </form> </body>
PHP经典验证码类下载:
PHP验证码类.rar