美文网首页
开发企业网站 --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