微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php验证码无错版无刷新更换验证码

为了这个验证码,在网上找了N多的资料,发现那些网上的代码不是这错误就是那错误,还有些文章方法写得很粗,对一个新手来说,简直不知从何处下手,我真搞不懂他们为什么要贴出来,真是误人子弟!

下面我将修改后(测试通过)的代码方法写出来供大家参考: 

第一步,新建一个code.PHP文件,在code.PHP加入下面这些代码并保存

<?PHP

/**

*  Verification Code Class

*

*  Used to anti-spam base at PHP GD Lib

*  @author Eric,<[email protected]>

*  @version 1.0

*  @copyright  Ereesoft Inc. 2009

*  @update 2009-05-14 22:32:05

*  @example

*      session_sratr();

*      $vcode = new Vcode();

*      $vcode->setLength(5);

*      $_SESSION['vcode'] = $vcode->paint();// To be encrypted by MD5

*/

class Vcode{

    /**

     *  @var $width The width of the image,auto Calculated 验证图片宽度,程序自动计算

     */

    private $width;

    /**

     *  @var $height Image height 验证图片高度

     */

    private $height;

    /**

     *  @var $length Verification Code lenght 验证码长度

     */

    private $length;

    /**

     *  @var $bgColor Image background color default random 验证图片背景色

     */

    private $bgColor;

    /**

     *  @var $fontColor The text color 验证码颜色

     */

    private $fontColor;

    /**

     *  @var $dotNoise The number of noise 噪点数量

     */

    private $dotNoise;

    /**

     *  @var $lineNoise The number of noise lines 干扰线数量

     */

    private $lineNoise;

    /**

     *  @var $im image resource GD图像操作资源

     */

    private $im;

    

    /**

     *  void Vcode::Vcode()

     *

     *  The constructor

     */

    public function Vcode(){

        $this->dotNoise = 5;//初始化噪点数量

        $this->lineNoise = 0;//初始化干扰线数量

    }

     /**

     *  void Vcode::setLength(integer $length)

     *

     *  Set Verification Code length

     *  @access public

     *  @param integer $length;

     *  @return void

     */

    public function setLength($length){

        $this->length = $length;

    }

    /**

     *  void Vcode::setBgColor(string $bgColor)

     *

     *  Set background color of the Verification Image

     *  @access public

     *  @param string $bgColor e.g.: #ffffff;可以直接使用css书写中的16进制写法,但不可简写

     *  @return void

     */

    public function setBgColor($bgColor){

        $this->bgColor = sscanf($bgColor,'#%2x%2x%2x');

    }

    /**

     *  void Vcode::setFontColor(string $fontgColor)

     *

     *  Set text color of the Verification Image

     *  @access public

     *  @param string $fontColor e.g.: #ffffff;可以直接使用css书写中的16进制写法,但不可简写

     *  @return void

     */

    public function setFontColor($fontColor){

        $this->fontColor = sscanf($fontColor,'#%2x%2x%2x');

    }

    /**

     *  void Vcode::setDotNoise(integer $num)

     *

     *  How many noise dots want to draw

     *  @access public

     *  @param integer $num Too much will lower performance

     *  @return void

     */

    public function setDotNoise($num){

        $this->dotNoise = $num;//手动设置噪点数量后,会覆盖初始设置

    }

    /**

     *  void Vcode::setLineNoise(integer $num)

     *

     *  How many noise lines want to draw

     *  @access public

     *  @param integer $num Too much will lower performance

     *  @return void

     */

    public function setLineNoise($num){

        $this->lineNoise = $num;//手动设置干扰线数量后,会覆盖初始设置

    }

    /**

     *  String Vcode::randString()

     *

     *  Create Random characters 生成随机字符串

     *  @access private

     *  @return String

     */

    private function randString(){

        $string = strtoupper(md5(microtime().mt_rand(0,9)));

        return substr($string,$this->length);

    }

    /**

     *  void Vcode::drawDot()

     *

     *  Draw dots noise 根据制定的数量随机画噪点,噪点颜色也随机

     *  @access private

     */

    private function drawDot(){

        for($i=0; $i<$this->dotNoise; $i++){

            $color = imagecolorallocate($this->im,

                                        mt_rand(0,255),255));//生成随机颜色

            imagesetpixel($this->im,

                            mt_rand(0,$this->width),$this->height),

                            $color);//在随机生成的坐标上画噪点

        }

    }

    /**

     *  void Vcode::drawLine()

     *

     *  Draw line noise 随机颜色随机画干扰线

     *  @access private

     */

    private function drawLine(){

        for($i=0; $i<$this->lineNoise; $i++){

            $color = imagecolorallocate($this->im,255));//随机生成颜色

            imageline($this->im,

                        mt_rand(0,

                        $color);//在随机生成的坐标上画干扰线

        }

    }

    /**

     *  String Vcode::paint()

     *

     *  Create image and output

     *  @access public

     *  @return string  The Verification Code to be encrypted by MD5

     */

    public function paint(){

    

        if(empty($this->length)) $this->length = 4;//验证码认长度为4

        

        $this->width =  $this->length*12+4 ;//计算验证图片宽度

        $this->height = 20;//制定验证码图片高度

        $this->im = imagecreate($this->width,$this->height);//创建画布

        

        if(empty($this->bgColor) || empty($this->fontColor)){//如果没有设置前景色和背景色则全部随机

            //避免前景色和背景色过于接近,背景色(0-130)的随机范围与前景色(131-255)分开

            imagecolorallocate( $this->im,

                                mt_rand(0,130),130));

                                

            $randString = $this->randString();

            

            for($i=0; $i<$this->length; $i++){

                $fontColor = imagecolorallocate($this->im,

                                                mt_rand(131,255));

                imagestring($this->im,3,

                            $i*10+8,8),

                            $randString{$i},

                            $fontColor);

                            //单个验证码字符高度随机,避免被OCR

            }

            

        } else {//如果设置了背景色和前景色,则不使用随机颜色

        

            imagecolorallocate( $this->im,

                                $this->bgColor[0],

                                $this->bgColor[1],

                                $this->bgColor[2]);

            $randString = $this->randString();

            $fontColor = imagecolorallocate($this->im,

                                            $this->fontColor[0],

                                            $this->fontColor[1],

                                            $this->fontColor[2]);

            for($i=0;$i<$this->length;$i++){

                imagestring($this->im,

                            $fontColor);//每个验证码字符高度仍然随机

            }

            

        }

        

        $this->drawDot();//绘制噪点

        $this->drawLine();//绘制干扰线

        imagepng($this->im);

        imagedestroy($this->im);

        return md5($randString);//返回MD5加密后的验证码,可直接放入session

        

    }

}

session_start();

$vcode = new Vcode();

$vcode->setLength(5);

$_SESSION['vcode']=$vcode->paint();// To be encrypted by MD5 

?> 

第二步:在登陆页面login.PHP调用验证码(注意:login.PHP和code.PHP 需放到同一个目录里面)

//login.PHP里面的代码如下:

<form id="form1" name="form1" method="post" action="test.PHP">

// test.PHP为提交后的验证页面

  <input name="yzm" type="text" class="STYLE1" id="yzm" />

  <img src="code.PHP?image" onclick="this.src='code.PHP?image'"/>

  <input name="Submit" type="submit" id="Submit" value="submit" />

</form> 

最后一步:开始验证输入的验证码是否正确,如果不正确,则返回登录页面

//创建一个test.PHP的测试页面,里面的代码如下

<?PHP

session_start();

//在页首先要开启session,

//error_reporting(2047);

session_destroy();

if($_POST[Submit]){

  if(md5($_POST[yzm])==$_SESSION['vcode']){

    echo "";

  }else{

     echo '<script>alert("验证码不正确,请重新输入!"); window.location.href="login.PHP"; </script>';

  }

}

?> 

到此结束,百分百有效,绝不会出现乱码!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐