• php 验证码


    学习地址:http://www.imooc.com/video/2458

    <?php 
    /**
     * 生成验证码
     * @param int $type
     * @param int $length
     * @return string
     */
    function buildRandomString($type=1,$length=4){
        if ($type == 1) {
            $chars = join ( "", range ( 0, 9 ) );
        } elseif ($type == 2) {
            $chars = join ( "", array_merge ( range ( "a", "z" ), range ( "A", "Z" ) ) );
        } elseif ($type == 3) {
            $chars = join ( "", array_merge ( range ( "a", "z" ), range ( "A", "Z" ), range ( 0, 9 ) ) );
        }
        if ($length > strlen ( $chars )) {
            exit ( "字符串长度不够" );
        }
        $chars = str_shuffle ( $chars );
        return substr ( $chars, 0, $length );
    }
    
    
    //通过GD库做验证码
    function verifyImage($type=1,$length=4,$pixel=0,$line=0,$sess_name = "verify"){
        session_start();
        //创建画布
        $width = 80;
        $height = 28;
        $image = imagecreatetruecolor ( $width, $height );
        $white = imagecolorallocate ( $image, 255, 255, 255 );
        $black = imagecolorallocate ( $image, 0, 0, 0 );
        //用填充矩形填充画布
        imagefilledrectangle ( $image, 1, 1, $width - 2, $height - 2, $white );
        $chars = buildRandomString ( $type, $length );
        $_SESSION [$sess_name] = $chars;
        //$fontfiles = array ("MSYH.TTF", "MSYHBD.TTF", "SIMLI.TTF", "SIMSUN.TTC", "SIMYOU.TTF", "STZHONGS.TTF" );
        $fontfiles = array ("SIMYOU.TTF" );
        //由于字体文件比较大,就只保留一个字体,如果有需要的同学可以自己添加字体,字体在你的电脑中的fonts文件夹里有,直接运行输入fonts就能看到相应字体
        for($i = 0; $i < $length; $i ++) {
            $size = mt_rand ( 14, 18 );
            $angle = mt_rand ( - 15, 15 );
            $x = 5 + $i * $size;
            $y = mt_rand ( 20, 26 );
            $fontfile = "../fonts/" . $fontfiles [mt_rand ( 0, count ( $fontfiles ) - 1 )];
            $color = imagecolorallocate ( $image, mt_rand ( 50, 90 ), mt_rand ( 80, 200 ), mt_rand ( 90, 180 ) );
            $text = substr ( $chars, $i, 1 );
            imagettftext($image, $size, $angle, $x, $y, $color, "", $text);
    
        }
        if ($pixel) {
            for($i = 0; $i < 50; $i ++) {
                imagesetpixel ( $image, mt_rand ( 0, $width - 1 ), mt_rand ( 0, $height - 1 ), $black );
            }
        }
        if ($line) {
            for($i = 1; $i < $line; $i ++) {
                $color = imagecolorallocate ( $image, mt_rand ( 50, 90 ), mt_rand ( 80, 200 ), mt_rand ( 90, 180 ) );
                imageline ( $image, mt_rand ( 0, $width - 1 ), mt_rand ( 0, $height - 1 ), mt_rand ( 0, $width - 1 ), mt_rand ( 0, $height - 1 ), $color );
            }
        }
        header ( "content-type:image/gif" );
        imagegif ( $image );
        imagedestroy ( $image );
    }

    网上找到的不错的验证码:http://www.jb51.net/article/40341.htm

    需要下载字体:elephant.ttf

    html使用:<img  title="点击刷新" src="./captcha.php" align="absbottom" onclick="this.src='captcha.php?'+Math.random();"></img>

    <?php 
    session_start();
    //验证码类
    class ValidateCode {
     private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子
     private $code;//验证码
     private $codelen = 4;//验证码长度
     private $width = 130;//宽度
     private $height = 50;//高度
     private $img;//图形资源句柄
     private $font;//指定的字体
     private $fontsize = 20;//指定字体大小
     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);
     }
    }
    
    //使用方法,通常是在另一个单独的php页面执行的:
    /*
    $_vc = new ValidateCode(); 
    $_vc->doimg();  
    $_SESSION['ValidateCode'] = $_vc->getCode();//验证码保存到SESSION中
    */
    //然后在html中引用php页面:
    /*
    <img  title="点击刷新" src="./captcha.php" align="absbottom" onclick="this.src='captcha.php?'+Math.random();"></img>
    */
    
    ?>
  • 相关阅读:
    查看每个核的资源情况
    什么时候使用NO_UNNEST
    走FILTER效率高的2种情况
    PL/SQL 包头和包体
    产品研发要配合好
    ElasticSearch 文档并发处理以及文档路由
    ES(ElasticSearch) 索引创建
    BaikalDB技术实现内幕(三)--代价模型实现
    腾讯位置服务地图SDK自定义地图和路况
    mysql数据库优化
  • 原文地址:https://www.cnblogs.com/CyLee/p/5725518.html
Copyright © 2020-2023  润新知