项目开发中验证码图片是必不可少的关键环节,比如登录的时候,为了防止机器不停的刷和提交,有了登录验证码,验证码一般有数字和字母加干扰点和干扰线,或者图片验证码,或者汉字验证码。图片验证码一般是事先定义好的图片,给出名称和值,进行验证。下面我们来写一个最常见的字母加数字验证码。先看看效果图吧。

雷小天博客

整个开发的代码有三个文件,一个是前端显示图片的代码default.php,还有就是获取图片的代码captcha.php,最后一个是判断处理的form.php。下面看看代码吧。

default.php

<?php
header("Content-Type: text/html;charset=utf-8");

?>
<!DOCTYPE html>
<html>
  <head>
   <meta chartset="utf-8">
  </head>
  <body>
     <form method="post"  action="form.php">
      <p>验证码图片:<img border="1" id="capthcha_img" onclick="this.src='captcha.php?r='+Math.random()" src="captcha.php?r="<?php echo rand();?> width="100" height="30"  /> <a href="javascript:void(0)" onclick="document.getElementById('capthcha_img').src='captcha.php?r='+Math.random()">换一个</a></p>

       <p>输入内容:<input type="text" name="autocode" value="" /></p>

    <p><input type="submit"  value="提交" style="padding:6px 20px;"/></p>


     </form>
  </body>


</html>

captcha.php

<?php
session_start(); //启动session

$image = imagecreatetruecolor(100,30);//创建一个宽100,高度30的图片
$bgcolor=imagecolorallocate($image,255,255,255);//图片背景是白色
imagefill($image,0,0,$bgcolor);//图片填充白色
//随机数,下面的例子是只是数字的验证码
/**
for($i=0;$i<4;$i++){
  $fontsize=6;
  $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
  $fontcontent=rand(0,9);
  $x=($i*100/4)+ rand(5,10);
  $y=rand(5,10);
  imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
**/
//随机数据,下面的例子是随机数据,包括字母和数字
$captch_code='';
for($i=0;$i<4;$i++){
  $fontsize=6;
  $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
  $data='asdfdfglfg74erf21854hgfhgfhkg4ljkghjtrtywiqpoqpwepdfgvnjytyut12313345645667686797800';
  $fontcontent=substr($data,rand(0,strlen($data)),1);
  $captch_code.=$fontcontent;

  $x=($i*100/4)+ rand(5,10);
  $y=rand(5,10);
  imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
$_SESSION['authcode']=$captch_code;

//随机点,生成干扰点
for($i=0;$i<200;$i++){
  $pointcolor=imagecolorallocate($image,rand(50,120),rand(50,120),rand(50,120));
  imagesetpixel($image,rand(1,99),rand(1,99),$pointcolor);
}
//随机线,生成干扰线
for($i=0;$i<3;$i++){
  $linecolor=imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220));
  imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
}
header("content-type:image/png");
imagepng($image);
imagedestory($image);

form.php

<?php
header("Content-Type: text/html;charset=utf-8");
   if(isset($_REQUEST['autocode'])){
      session_start();
      if(strtolower($_POST['autocode']) == $_SESSION['authcode']){
       echo '正确';
      }else{
      echo'错误';
      }

   exit();
   }

?>