PHP生成验证码时“图像因其本身有错无法显示”的解决方法


Posted in PHP onAugust 07, 2013

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

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

确认码生成文件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);
/*绘图结束*/

确认码调用文件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>
PHP 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
动态新闻发布的实现及其技巧
Oct 09 PHP
php 之 没有mysql支持时的替代方案
Oct 09 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
Jul 03 PHP
PHP临时文件的安全性分析
Jul 04 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
php数组分页实现方法
Apr 30 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
PHP 对象继承原理与简单用法示例
Apr 21 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
May 29 PHP
对于PHP 5.4 你必须要知道的
Aug 07 #PHP
php缓存技术详细总结
Aug 07 #PHP
IIS6.0中配置php服务全过程解析
Aug 07 #PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 #PHP
Win下如何安装PHP的APC拓展
Aug 07 #PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 #PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 #PHP
You might like
php中iconv函数使用方法
2008/05/24 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
python模块之paramiko实例代码
2018/01/31 Python
python Celery定时任务的示例
2018/03/13 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
大学生职业生涯规划书前言
2014/01/09 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
学校创先争优活动总结
2014/08/28 职场文书
小学生作文评语集锦
2014/12/25 职场文书
汽车转让协议书
2015/01/29 职场文书
三下乡个人总结
2015/03/04 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
2016大学军训心得体会
2016/01/11 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python