美文网首页
开发企业网站 --GD画图 -- 生成验证码

开发企业网站 --GD画图 -- 生成验证码

作者: 潘肚饿兵哥哥 | 来源:发表于2019-09-25 22:25 被阅读0次

\color{rgba(254, 67, 101, .8)}{首先封装一个随机字符串函数}

//封装一个随机字符串函数,以便调用
    function rand_str($len=4, $style=1){
        switch($style){
            //如果$style=1,则他是0-9的纯数字数组
            //如果$style=2,则他是a-z的纯字母数组,array_merge()合并数组
            //如果$style=3,则他是a-z  0-9 的字母数字组合数组,
            //默认值是字母数字全有
            case 1: $arr = range(0, 9); break;
            case 2: $arr = array_merge(range('a', 'z'), range('A', 'Z')); break;
            case 3: $arr = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9)); break;
            default: $arr = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
        }

        //随机打乱数组
        shuffle($arr);

        //截取一段数组元素,0是表示从头开始取,正数从头开始取,负数从尾开始取
        $subarr = array_slice($arr, 0, $len);
        //implode()把数组元素组合为字符串并返回
        return implode($subarr);
    }
    $code = rand_str();
    echo $code;
image.png

\color{rgba(254, 67, 101, .8)}{session\_start从函数开始时就设置好}

session_start(); 开始会话
$_SESSION['verify'] = strtolower($code);结束会话,并把通话过程中产生的数据保存为一个数组

可以到另一个页面读取会话,以实现页面之间的通信

\color{rgba(254, 67, 101, .8)}{创建一个会话的步骤:}
\color{rgba(254, 67, 101, .8)}{启动会话→存储会话→读取会话→删除会话}
\color{rgba(254, 67, 101, .8)}{}

\color{rgba(254, 67, 101, .8)}{封装验证码函数}

<?php
/*  

    将6个参数封装成一个数组之后,不但传参可以单独传,而且不用管顺序
    在这里给参数,下面varify()传参数,就可以修改了
    $config = ['style'=>3, 'disturb'=>false, 'size'=> 30, 'len' => 6];
 
    */


    //调用验证码函数
    varify();

    //封装验证码函数
    function varify($config=[]){

        //相当于从这里开始保存,到下面结束$_SESSION['verify'] = strtolower($code);处结束
        session_start();
        header("content-type: image/png;");//告诉浏览器文件类型

        //将这6个参数封装成一个数组$config,如果给定参数,就是用给定的
        //如果没有给参数,就使用默认的
        //style是随机字符串,1是数字,2是字母,3是数字加字母
        //宽度和高度如果传了参数就以传的参数为准,否则用默认的
        $size = !empty($config['size'])?$config['size']:20;
        $len = !empty($config['len'])?$config['len']:4;
        $style = !empty($config['style'])?$config['style']:1;
        $width = !empty($config['width'])?$config['width']:($size + 5)*$len;
        $height = !empty($config['width'])?$config['width']:$size + 15;


        //默认需要干扰,在调试的时候可以关掉它,改成false就没有干扰了
        //这里不能用!empty,应为false是空,empty也是空,会出错
        //所以用isset来设置
        $disturb = isset($config['disturb'])?$config['disturb']:true;



        //创建画布
        $im = imagecreatetruecolor($width, $height);
        $gray = imagecolorallocate($im, 240, 240, 240);
        $black = imagecolorallocate($im, 0, 0, 0);

        //验证码画布设置背景颜色  
        imagefill($im, 0, 0, $gray);                                                                                       


        //画干扰
        //角度、x、y轴、颜色都给随机范围
        //if是判断是否需要干扰,用于调试
        //for是干扰
        if($disturb){
            //随机给0-50个干扰项
            for($i=0; $i<50; $i++){
                $c = rand_str(1, 3);
                //颜色范围随机
                $color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
                //角度、x、y轴都给随机范围
                imagechar($im, mt_rand(1, 5), mt_rand(0, $width), mt_rand(0, $height), $c, $color);
            }
        }
        


        $code = rand_str($len, $style);


        //session在这里接收随机出来的验证码字符串,并把他转换成小写
        //验证码一般都是只输小写就可以了
        //将他转换成小写之后,到另一个页面进行比较
        $_SESSION['verify'] = strtolower($code);


        //将随机出来的字符分别提取出来一个一个显示
        //给每一个字符不定的位置和不定的显示角度
        for($i=0; $i<strlen($code); $i++){
            //每一个字符的位置坐标移动多少距离
            $x = $size*$i+10;
            //$y的坐标在这两个值之间随机产生
            $y = mt_rand($height-10, $height-5);
            imagettftext($im, $size, mt_rand(0, 20), $x, $y, $black, 'C:/Windows/Fonts/simsun.ttc', $code[$i]);
        }

        

        imagepng($im);//有两个参数,有第二个就是存储,没有就是显示
        imagedestroy($im);//销毁画布资源

    }
    



    
    //封装一个随机字符串函数,以便调用
    function rand_str($len=4, $style=1){
        switch($style){
            //如果$style=1,则他是0-9的纯数字数组
            //如果$style=2,则他是a-z的纯字母数组,array_merge()合并数组
            //如果$style=3,则他是a-z  0-9 的字母数字组合数组,
            //默认值是字母数字全有
            case 1: $arr = range(0, 9); break;
            case 2: $arr = array_merge(range('a', 'z'), range('A', 'Z')); break;
            case 3: $arr = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9)); break;
            default: $arr = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
        }

        //随机打乱数组
        shuffle($arr);

        //截取一段数组元素,0是表示从头开始取,正数从头开始取,负数从尾开始取
        $subarr = array_slice($arr, 0, $len);
        //implode()把数组元素组合为字符串并返回
        return implode($subarr);
    }

    //调用函数
    $code = rand_str();
?>
image.png

相关文章

网友评论

      本文标题:开发企业网站 --GD画图 -- 生成验证码

      本文链接:https://www.haomeiwen.com/subject/dzecuctx.html