首页 > php图像处理 > php验证码生成程序代码

php验证码生成程序代码

本文章给大家介绍利用session存储与gd库一并生成验证码程序,同时会加入一些干扰元素,这样就可以简单的防机器注册了,下面我来给各位同学介绍介绍.

PHP验证码并生成图片程序,采用了session识别,稍微改进了一下目前网络上流传的PHP验证码,加入杂点,数字颜色随机显示,控制4位数字显示,话不多说了,程序如下,分享出来.

新建yz.php验证码生成文件,以下代码需要打开php的GD库,修改php.in文件的配置,把已经注释掉的行之前的分号取消即可:extension=php_gd2.dll,代码如下:

<?php
class ValidationCode {
    //属性
    private $width;
    private $height;
    private $codeNum;
    private $image;
    private $disturbColorNum; //干扰元素数目
    private $checkCode;
    function __construct($width = 80, $height = 20, $codeNum = 4) {
        $this->width = $width;
        $this->height = $height;
        $this->codeNum = $codeNum;
        $number = floor($width * $height / 15);
        if ($number > 240 - $codeNum) {
            $this->disturbColorNum = 240 - $codeNum;
        } else {
            $this->disturbColorNum = $number;
        }
        $this->checkCode = $this->createCheckcode();
    }
    function getCheckCode() {
        return $this->checkCode;
    }
    private function createImage() {
        $this->image = imagecreatetruecolor($this->width, $this->height);
        $backcolor = imagecolorallocate($this->image, rand(225, 255) , rand(225, 255) , rand(255, 255));
        imagefill($this->image, 0, 0, $backcolor);
        $border = imagecolorallocate($this->image, 0, 0, 0);
        imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $border);
    }
    private function setDisturbColor() {
        for ($i = 0; $i < $this->disturbColorNum; $i++) {
            $color = imagecolorallocate($this->image, rand(0, 255) , rand(0, 255) , rand(0, 255));
            imagesetpixel($this->image, rand(1, $this->width - 2) , rand(1, $this->height - 2) , $color);
        }
        for ($i = 0; $i < 10; $i++) {
            $color = imagecolorallocate($this->image, rand(0, 255) , rand(0, 255) , rand(0, 255));
            imagearc($this->image, rand(-10, $this->width) , rand(-10, $this->height) , rand(30, 300) , rand(20, 300) , 55, 44, $color);
        }
    }
    private function outputText($fontFace = "") {
        for ($i = 0; $i < $this->codeNum; $i++) {
            $fontcolor = imagecolorallocate($this->image, rand(0, 128) , rand(0, 128) , rand(0, 128));
            if ($fontFace == "") {
                $fontsize = rand(3, 5);
                $x = floor($this->width / $this->codeNum) * $i + 5;
                $y = rand(0, $this->height - 15);
                imagechar($this->image, $fontsize, $x, $y, $this->checkCode{$i}, $fontcolor);
            } else {
                $fontsize = rand(12, 16);
                $x = floor(($this->width - 8) / $this->codeNum) * $i + 8;
                $y = rand($fontsize, $this->height - 8);
                imagettftext($this->image, $fontsize, rand(-45, 45) , $x, $y, $fontcolor, $fontFace, $this->checkCode{$i});
            }
        }
    }
    private function createCheckCode() {
        $code = "23456789abcdefghijkmnpqrstuvwrst";
        $str = "";
        for ($i = 0; $i < $this->codeNum; $i++) {
            $char = $code{rand(0, strlen($code) - 1) };
            $str.= $char;
        }
        return $str;
    }
    private function outputImage() {
        if (imagetypes() & IMG_GIF) {
            header("Content-Type:image/gif");
            imagepng($this->image);
        } else if (imagetypes() & IMG_JPG) {
            header("Content-Type:image/jpeg");
            imagepng($this->image);
        } else if (imagetypes() & IMG_PNG) {
            header("Content-Type:image/png");
            imagepng($this->image);
        } else if (imagetypes() & IMG_WBMP) {
            header("Content-Type:image/vnd.wap.wbmp");
            imagepng($this->image);
        } else {
            die("PHP不支持图片验证码");
        }
    }
    //通过该方法向浏览器输出图像
    function showImage($fontFace = "") {
        //创建图像背景
        $this->createImage();
        //设置干扰元素
        $this->setDisturbColor();
        //向图像中随机画出文本
        $this->outputText($fontFace);
        //输出图像
        $this->outputImage();
    }
    function __destruct() {
        imagedestroy($this->image);
    }
}
function checklogin() {
    if (emptyempty($_POST['name'])) die('用户名不能为空');
    if (emptyempty($_POST['password'])) die("密码不能为空");
    if ($_SESSION['code'] != $_POST['vertify']) die("验证码输入不正确" . $_SESSION['code']);
    $username = $_POST['name'];
    $password = md5($_POST['password']);
    //检查是否存在
    conndb($username, $password);
}
function conndb($name = "", $ps = "") {
    $conn = mysql_connect('localhost', 'root', '123456');
    if (!$conn) die("数据库连接失败" . mysql_error());
    mysql_select_db('5kan', $conn) or die('选择数据库失败' . mysql_error());
    mysql_set_charset('utf8', $conn);
    $sql = "select id from k_user where  username='{$name}' and password='{$ps}'";
    $result = mysql_query($sql) or die("SQL语句错误" . mysql_error());
    if (mysql_num_rows($result) > 0) die("登录成功");
    else die("用户名或者密码错误");
    mysql_close($conn);
}
session_start();
if (!isset($_POST['randnum'])) { //开源代码phprm.com
    $code = new ValidationCode(120, 20, 4);
    $code->showImage("comicbd.ttf"); //显示在页面
    $_SESSION['code'] = $code->getCheckCode(); //保存在服务器中
    
} else {
    checklogin();
}
?>

到具体调用的地方,用这样的形式:<img src="/yz.php" align="absmiddle" />就可以了;验证的时候验证session:$_SESSION['VCODE']的值就可以了,还可以对以上代码稍微改进,改成两个数字相加求和的形式.


文章网址:http://www.phprm.com/tuxiang/fs4642.html

随意转载^^但请附上教程地址。

标签:php验证码 php验证例子

相关文章

发表留言