广东十一选五开奖 > 计算机网络 > php生成验证码图片从入门和精通教程

原标题:php生成验证码图片从入门和精通教程

浏览次数:102 时间:2019-10-01

方法一

今天使用代码进行PHP生成校验码功能的实现,发现firefox一直提示“图像.......因其本身有错无法显示”的问题,作者也提示了说“如果浏览器显示“图像XXX因其本身有错无法显示”,可尽量去掉文中空格”,但把代码中所有空格都去掉了还是不能显示检验图片。

 代码如下

于是深度google,大部分的解决方案也是将“<?”这句代码前的空格回车一切都删掉以防止有html输出,但这根本解决不了我的问题,后来看到有人在Header("Content-type: image/PNG");这句代码前使用ob_clean()清除输出,结果一试之下果然成功。现将原代码修改后贴到下面,以备不时之需:

$authnum='';
$ychar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
$list=explode(",",$ychar);//分割函数
for($i=0;$i<4;$i++){
$randnum=rand(0,35);
$authnum.=$list[$randnum];//以数组的形式输出

确认码生成文件checkNum_session.php

方法二:   

复制代码 代码如下:

 代码如下

Header("Content-type: image/png");
/*
* 初始化
*/
$border = 1; //是否要边框 1要:0不要
$how = 4; //验证码位数
$w = $how*15; //图片宽度
$h = 20; //图片高度
$fontsize = 6; //字体大小
$alpha = "abcdefghijkmnopqrstuvwxyz"; //验证码内容1:字母
$number = "023456789"; //验证码内容2:数字
$randcode = ""; //验证码字符串初始化
srand((double)microtime()*1000000); //初始化随机数种子
$im = ImageCreate($w, $h); //创建验证图片
/*
* 绘制基本框架
*/
$bgcolor = ImageColorAllocate($im, 255, 255, 255); //设置背景颜色
ImageFill($im, 0, 0, $bgcolor); //填充背景色
if($border)
{
    $black = ImageColorAllocate($im, 0, 0, 0); //设置边框颜色
    ImageRectangle($im, 0, 0, $w-1, $h-1, $black);//绘制边框
}
/*
* 逐位产生随机字符
*/
for($i=0; $i<$how; $i++)
{  
    $alpha_or_number = mt_rand(0, 1); //字母还是数字
    $str = $alpha_or_number ? $alpha : $number;
    $which = mt_rand(0, strlen($str)-1); //取哪个字符
    $code = substr($str, $which, 1); //取字符
    $j = !$i ? 4 : $j+15; //绘字符位置
    $color3 = ImageColorAllocate($im, mt_rand(0,100), mt_rand(0,100), mt_rand(0,100)); //字符随即颜色
    ImageChar($im, $fontsize, $j, 3, $code, $color3); //绘字符
    $randcode .= $code; //逐位加入验证码字符串
}
//把验证码字符串写入session
session_start();
$_SESSION['authnum_session'] = $randcode;
/*
* 添加干扰
*/
for($i=0; $i<1; $i++)//绘背景干扰线
{  
    $color1 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰线颜色
    ImageArc($im, mt_rand(-5,$w), mt_rand(-5,$h), mt_rand(20,300), mt_rand(20,200), 55, 44, $color1); //干扰线
}  
for($i=0; $i<$how*40; $i++)//绘背景干扰点
{  
    $color2 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰点颜色
    ImageSetPixel($im, mt_rand(0,$w), mt_rand(0,$h), $color2); //干扰点
}
//关键代码,防止出现'图像因其本身有错无法显示'的问题
ob_clean();
/*绘图结束*/
Imagegif($im);
ImageDestroy($im);
/*绘图结束*/

private function createCheckCode()
{
for(i=0;i<this->codeNum;i++)
{
number = rand(0,2);
switch(number)
{
case 0: rand_number = rand(48,57); break;//数字
case 1: rand_number = rand(65,90);break;//大写字母
case 2: rand_number = rand(97,122);break;//小写字母
}
$asc = sprintf("%c",rand_number);
$asc_number = asc_number.asc;
}
return asc_number;
}

确认码调用文件sessionValidate.php

方法三:   

复制代码 代码如下:

 代码如下

<span style="font-size:14px;"><?php
session_start();
//在页首先要开启session,
//error_reporting(2047);
session_destroy();
//将session去掉,以每次都能取新的session值;
//用seesion 效果不错,也很方便
?>
<html>
<head>
<title>session 图片验证实例</title>
</head>
<body>
此例为session验证实例
<form action="" method="post">
验证码:<input type="text" name="validate" value="" size=10> <img src="checkNum_session.php"><br>
<input type="submit">
</form>
<?php
//打印上一个session;
echo "上一个session:<b>".$_SESSION["authnum_session"]."</b><br>";
$validate="";
if(isset($_POST["validate"])){
$validate=$_POST["validate"];
echo "您刚才输入的是:".$_POST["validate"]."<br>状态:";
if($validate!=$_SESSION["authnum_session"]){
//判断session值与用户输入的验证码是否一致;
echo "<font color=red>输入有误</font>";
}else{
echo "<font color=green>通过验证</font>";
}
}
/*
//打印全部session;
PrintArr($_SESSION);
function PrintArr($aArray){
echo '<xmp>';
print_r($aArray);
echo '</xmp>';
}
*/
?></span>

srand(microtime()*100000);//相当于计时器
$string="abcdefghigklmnopqrstuvwxyz123456789";
for($i=0;$i<4;$i++)
{
$new_number.=$string[rand(0,strlen($string)-1)];//随即的产生一个数组
}

您可能感兴趣的文章:

  • 完美解决thinkphp验证码出错无法显示的方法
  • PHP验证码无法显示的原因及解决办法

方法四:   

 代码如下

for($i=0;$i<4;$i++)
{
$rand.=dechex(rand(1,15));//将十进制转化为十六进制
}

 

随机生成数字,字母的代码:

 

 代码如下

<?php
//che.php
session_start();
for($i=0;$i<4;$i++)
{
$rand.=dechex(rand(1,15));
}
$_SESSION['check_num']=$rand;
$image=imagecreatetruecolor(50,30);
$bg=imagecolorallocate($im,0,0,0);//第一次用调色板的时候,背景颜色
$te=imagecolorallocate($im,255,255,255);
imagestring($image,6,rand(0,20),rand(0,2),$rand,$te);
ob_clean();//PHP网页中因为 要生成验证码而出现 图像"
header("Content-type:image/jpeg"); imagejpeg($image);
?>

给图片画出干扰线代码:   

 代码如下

for($i=0;$i<8;$i++)//画出多条线
{
$cg=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));//产生随机的颜色
imageline($im,rand(10,40),0,rand(10,40),20,$cg);
}

给图片画出干扰点的代码:   

 代码如下

for($i=0;$i<80;$i++)//画出多个点
{
imagesetpixel($im,rand(0,40),rand(0,20),$cg);
}

把文字写入图片代码:   

 代码如下

$str=array('我','我','亲','亲');//存储显示的汉字
for($i=0;$i<4;$i++)
{
$sss.=$str[rand(0,3)];//随机显示汉字
}

//$str=iconv("gb2312","utf-8",$str); //汉字编码转化,我的好像不需要
imagettftext($im,10,0,rand(5,60),rand(5,60),$te,"simhei.ttf",$sss);//

最后我们结合实际分享一个完整的实例

 

 代码如下

/**
 * 生成验证码图片
 *
 * @param String $word 验证码在session中的变量名称
 */
function valiCode($word='randcode'){
 Header("Content-type: image/gif");
 $border = 0; //是否要边框 1要:0不要
 $how = 4; //验证码位数
 $w = $how*15; //图片宽度
 $h = 18; //图片高度
 $fontsize = 10; //字体大小
 $alpha = "abcdefghijkmnpqrstuvwxyz"; //验证码内容1:字母
 $number = "23456789"; //验证码内容2:数字
 $randcode = ""; //验证码字符串初始化
 srand((double)microtime()*1000000); //初始化随机数种子
 $im = ImageCreate($w, $h); //创建验证图片
 /*
 * 绘制基本框架
 */
 $bgcolor = ImageColorAllocate($im, 255, 255, 255); //设置背景颜色
 ImageFill($im, 0, 0, $bgcolor); //填充背景色
 if($border)
 {
  $black = ImageColorAllocate($im, 0, 0, 0); //设置边框颜色
  ImageRectangle($im, 0, 0, $w-1, $h-1, $black);//绘制边框
 }
 
 /*
 * 逐位产生随机字符
 */
 for($i=0; $i<$how; $i++)
 {
  $alpha_or_number = mt_rand(0, 1); //字母还是数字
  $str = $alpha_or_number ? $alpha : $number;
  $which = mt_rand(0, strlen($str)-1); //取哪个字符
  $code = substr($str, $which, 1); //取字符
  $j = !$i ? 4 : $j+15; //绘字符位置
  $color3 = ImageColorAllocate($im, mt_rand(0,100), mt_rand(0,100), mt_rand(0,100)); //字符随即颜色
  ImageChar($im, $fontsize, $j, 3, $code, $color3); //绘字符
  $randcode .= $code; //逐位加入验证码字符串
 }
 
 /*
 * 如果需要添加干扰就将注释去掉
 *
 * 以下for()循环为绘背景干扰线代码
 */
 /* + -------------------------------绘背景干扰线 开始-------------------------------------------- + */
 for($i=0; $i<5; $i++)//绘背景干扰线
 {
  $color1 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰线颜色
  ImageArc($im, mt_rand(-5,$w), mt_rand(-5,$h), mt_rand(20,300), mt_rand(20,200), 55, 44, $color1); //干扰线
 }
 /* + -------------------------------绘背景干扰线 结束-------------------------------------- + */
 
 /*
 * 如果需要添加干扰就将注释去掉
 *
 * 以下for()循环为绘背景干扰点代码
 */
 /* + --------------------------------绘背景干扰点 开始------------------------------------------ + */
 
 for($i=0; $i<$how*40; $i++)//绘背景干扰点
 {
  $color2 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰点颜色
  ImageSetPixel($im, mt_rand(0,$w), mt_rand(0,$h), $color2); //干扰点
 }
 
 /* + --------------------------------绘背景干扰点 结束------------------------------------------ + */
 
 //把验证码字符串写入session  方便提交登录信息时检验验证码是否正确  例如:$_POST['randcode'] = $_SESSION['randcode']
 $_SESSION[$word] = $randcode;
 /*绘图结束*/
 Imagegif($im);
 ImageDestroy($im);
 /*绘图结束*/
}

调用方法也很简单把上面实例保存img.php文件,然后在要调用的页面
html页面如下

 代码如下

<script language="javascript">
 function refresh_code()
 {
  form1.imgcode.src="verifycode.php?a="+Math.random();
 }
</script>

<form id="form1" name="form1" method="post" action="checkcode.php">
  <label for="code">验证码:</label>
  <input type="text" name="code" id="textfield" />
  <img id="imgcode" src="VerifyCode.php" alt="验证码" />
  <a href="javascript:refresh_code()">看不清?换一个</a>
  <input type="submit" name="button" id="button" value="提交" />
</form>

这要就可以实现验证码调用了。

再加个提交验证验证码是否正确

 代码如下

<?php
session_start();
  if((strtoupper($_POST["code"])) == strtoupper(($_SESSION["VerifyCode"]))){
 print("验证码正确,");
  }else{
    print("验证码错误,");
  }

?>

这要就我们完成了从生成验证码图片和使用的整个过程了,也算是从php入门到精通验证码全部讲了。

本文由广东十一选五开奖发布于计算机网络,转载请注明出处:php生成验证码图片从入门和精通教程

关键词:

上一篇:php中文文名下载乱码解决方法

下一篇:强php编码转换函数