验证码类validateCode

PHP验证码类,代码如下:

<?php 
//验证码类
class ValidateCode {
    private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子
    private $code;//验证码
    private $codelen = 4;//验证码长度
    private $width = 52;//宽度
    private $height = 28;//高度
    private $img;//图形资源句柄
    private $font;//指定的字体
    private $fontsize = 11;//指定字体大小
    private $fontcolor;//指定字体颜色
    
    //构造方法初始化
    public function __construct() {
        $this->font = dirname(__FILE__).'/font/elephant.ttf';//注意字体路径要写对,否则显示不了图片
    }
    
    //生成随机码
    private function createCode() {
        $_len = strlen($this->charset)-1;
        for ($i=0;$i<$this->codelen;$i++) {
            $this->code .= $this->charset[mt_rand(0,$_len)];
        }
    }
    
    //生成背景
    private function createBg() {
        $this->img = imagecreatetruecolor($this->width, $this->height);
        $color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));
        imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);
    }
    
    //生成文字
    private function createFont() {
        $_x = $this->width / $this->codelen;
        for ($i=0;$i<$this->codelen;$i++) {
            $this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
            imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);
        }
    }
    
    //生成线条、雪花
    private function createLine() {
    //线条
    for ($i=0;$i<6;$i++) {
        $color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
        imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
    }
    
    //雪花
    for ($i=0;$i<100;$i++) {
        $color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
        imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);
        }
    }
    
    //输出
    private function outPut() {
        header('Content-type:image/png');
        imagepng($this->img);
        imagedestroy($this->img);
    }
    
    //对外生成
    public function doImg() {
        $this->createBg();
        $this->createCode();
        $this->createLine();
        $this->createFont();
        $this->outPut();
    }
    
    //获取验证码
    public function getCode() {
        return strtolower($this->code);
    }
}

使用方法:
1、先把验证码类保存为一个名为 validateCode.php 的文件;

2、新建一个名为 captcha.php 的文件进行调用该类;
captcha.php中的代码如下:

<?php
session_start();
require 'validateCode.php';  //先把类包含进来,实际路径根据实际情况进行修改。
$validate = new ValidateCode();  //实例化一个对象
$validate->doImg();  
$_SESSION['validate_code'] = $validate->getCode();//验证码保存到SESSION中

在页面中调用验证码的代码如下:

<input type="text" name="validate" size="10"/>
<img title="点击刷新" src="./validateCode/captcha.php" onclick="this.src='./validateCode/captcha.php?'+Math.random();"></img> //src是验证码图片的调用路径,onclick是点击后重新生成一个验证码如果不加上Math.random() 验证码就只能刷新一次,

验证码通过表单提交到后台后,代码如下:

if(isset($_REQUEST["validate"])){
    $validate=$_REQUEST["validate"];
    if($validate!=$_SESSION["validate_code"]){
        exit('验证码错误');
    }else{
        echo '验证码正确';
    }
}

附验证码图片:

 

posted @ 2018-04-02 14:18  Chrdai  阅读(2960)  评论(0编辑  收藏  举报