当前位置:首页 > PHP教程 > php类库 > 列表

一个经典的PHP验证码类分享

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-26 17:24:42 浏览: 评论:0 

这篇文章主要介绍了一个经典的PHP验证码类分享,本文不仅提供了类代码,还提供了使用例子及表单中使用的方法,需要的朋友可以参考下

我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode。将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中。只要在创建对象时,为构造方法提供三个参数,包括创建验证码图片的宽度、高度及验证码字母个数,就可以成功创建一个验证码类的对象。该类的声明代码如下所示:

  1. <?php 
  2.  class Vcode { 
  3.   private $width//宽 
  4.   private $height//高 
  5.   private $num;  //数量 
  6.   private $code//验证码 
  7.   private $img;  //图像的资源 
  8.    
  9.   //构造方法, 三个参数 
  10.   function __construct($width=80, $height=20, $num=4) { 
  11.    $this->width = $width
  12.    $this->height = $height
  13.    $this->num = $num
  14.    $this->code = $this->createcode(); //调用自己的方法 
  15.   } 
  16.    
  17.   //获取字符的验证码, 用于保存在服务器中 
  18.   function getcode() { 
  19.    return $this->code; 
  20.   } 
  21.    
  22.   //输出图像 
  23.   function outimg() { 
  24.    //创建背景 (颜色, 大小, 边框) 
  25.    $this->createback(); 
  26.    
  27.    //画字 (大小, 字体颜色) 
  28.    $this->outstring(); 
  29.    
  30.    //干扰元素(点, 线条) 
  31.    
  32.    $this->setdisturbcolor(); 
  33.    //输出图像 
  34.    $this->printimg(); 
  35.   } 
  36.    
  37.   //创建背景 
  38.   private function createback() { 
  39.    //创建资源 
  40.    $this->img = imagecreatetruecolor($this->width, $this->height); 
  41.    //设置随机的背景颜色 
  42.    $bgcolor = imagecolorallocate($this->img, rand(225, 255), rand(225, 255), rand(225, 255));  
  43.    //设置背景填充 
  44.    imagefill($this->img, 0, 0, $bgcolor); 
  45.    //画边框 
  46.    $bordercolor = imagecolorallocate($this->img, 0, 0, 0); 
  47.    
  48.     imagerectangle($this->img, 0, 0, $this->width-1, $this->height-1, $bordercolor); 
  49.   } 
  50.    
  51.   //画字 
  52.   private function outstring() { 
  53.    for($i=0; $i<$this->num; $i++) { 
  54.    
  55.     $color= imagecolorallocate($this->img, rand(0, 128), rand(0, 128), rand(0, 128));  
  56.    
  57.     $fontsize=rand(3,5); //字体大小 
  58.    
  59.     $x = 3+($this->width/$this->num)*$i//水平位置 
  60.     $y = rand(0, imagefontheight($fontsize)-3); 
  61.    
  62.     //画出每个字符 
  63.     imagechar($this->img, $fontsize$x$y$this->code{$i}, $color); 
  64.    } 
  65.   } 
  66.    
  67.   //设置干扰元素 
  68.   private function setdisturbcolor() { 
  69.    //加上点数 
  70.    for($i=0; $i<100; $i++) { 
  71.     $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 255), rand(0, 255));  
  72.     imagesetpixel($this->img, rand(1, $this->width-2), rand(1, $this->height-2), $color); 
  73.    } 
  74.    
  75.    //加线条 
  76.    for($i=0; $i<10; $i++) { 
  77.     $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 128), rand(0, 255));  
  78.     imagearc($this->img,rand(-10, $this->width+10), rand(-10, $this->height+10), rand(30, 300), rand(30, 300), 55,44, $color); 
  79.    } 
  80.   } 
  81.    
  82.   //输出图像 
  83.   private function printimg() { 
  84.    if (imagetypes() & IMG_GIF) { 
  85.      header("Content-type: image/gif"); 
  86.      imagegif($this->img); 
  87.    } elseif (function_exists("imagejpeg")) { 
  88.      header("Content-type: image/jpeg"); 
  89.      imagegif($this->img); 
  90.    } elseif (imagetypes() & IMG_PNG) { 
  91.      header("Content-type: image/png"); 
  92.      imagegif($this->img); 
  93.    } else { 
  94.      die("No image support in this PHP server"); 
  95.    }  
  96.    
  97.   } 
  98.    
  99.   //生成验证码字符串 
  100.   private function createcode() { 
  101.    $codes = "3456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY"
  102.    
  103.    $code = ""
  104.    
  105.    for($i=0; $i < $this->num; $i++) { 
  106.     $code .=$codes{rand(0, strlen($codes)-1)};  
  107.    } 
  108.    
  109.    return $code
  110.   } 
  111.    
  112.   //用于自动销毁图像资源 
  113.   function __destruct() { 
  114.    imagedestroy($this->img); 
  115.   } 
  116.    
  117.  } 

在上面的脚本中,虽然声明验证码类Vcode的代码比较多,但细节都被封装在类中,只要直接输出对象,就可以向客户端浏览器中输出幅图片,并可以在浏览器表单中使用。另外本类自动获取验证码图片中的字符串,促成在服务的$_SESSION["code"]中。在提交表单时,只有用户在表单中输入验证码图片上显示的文字,并和服务器中保留的验证码字符串完全相同时,表单才可以提交成功。(注意:验证码在服务器端在$_SESSION["code"]中,所以必须开启session会话才能使用该类,)

在下面的脚本code.php中,使用session_start()开启用户会话控制,然后包含验证码类Vcode所在文件vcode.class.php,创建该类对象并直接输出。就可以将随机生成的验证码图片发送出去,同时会自动将这个验证码字符串保存在服务器中一份。代码如下所示:

  1. <?php 
  2.  //开启session 
  3.  session_start(); 
  4.  include "vcode.class.php"
  5.  //构造方法 
  6.  $vcode = new Vcode(80, 30, 4); 
  7.  //将验证码放到服务器自己的空间保存一份 
  8.  $_SESSION['code'] = $vcode->getcode(); 
  9.  //将验证码图片输出 
  10.  $vcode->outimg(); 
  11. ?> 

表单代码如下所示:

  1. <?php 
  2.  session_start(); 
  3. if(isset($_POST['dosubmit'])) { 
  4.  if(strtoupper($_SESSION['code']) == strtoupper($_POST['code']) ) { 
  5.   echo "输入成功!<br>"
  6.  }else
  7.   echo "输入不对!<br>"
  8.  } 
  9. ?> 
  10.    
  11. <body> 
  12.  <form action="reg.php" method="post"
  13.   username: <input type="text" name="username"> <br> 
  14.   password: <input type="password" name="password"> <br> 
  15.   code: <input type="text" onkeyup="if(this.value!=this.value.toUpperCase()) this.value=this.value.toUpperCase()" size="6" name="code">  
  16.     <img src="code.php" onclick="this.src='code.php?'+Math.random()" /> <br> 
  17.   <input type="submit" name="dosubmit" value="登 录"> <br> 
  18.  </form> 
  19. </body> 

Tags: PHP验证码类

分享到: