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 相关文章推荐
在PHP中检查PHP文件是否有语法错误的方法
Dec 23 PHP
PHPCMS的使用小结
Sep 20 PHP
PHP数据类型之布尔型的介绍
Apr 28 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
Jun 23 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
19个Android常用工具类汇总
Dec 30 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 PHP
Laravel 框架返回状态拦截代码
Oct 18 PHP
PHP的imageTtfText()函数深入详解
Mar 03 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下通过伪造http头破解防盗链的代码
2010/07/03 PHP
php正则表达式(regar expression)
2011/09/10 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
javascript 多级checkbox选择效果
2009/08/20 Javascript
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
深入研究React中setState源码
2017/11/17 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
Python request设置HTTPS代理代码解析
2018/02/12 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
Python中Unittest框架的具体使用
2019/08/27 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
CSS3 开发工具收集
2010/04/17 HTML / CSS
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
html5实现滑块功能之type=&quot;range&quot;属性
2020/02/18 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
职称自我鉴定
2013/10/15 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
文明村创建实施方案
2014/03/27 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
宪法宣传标语100条
2019/10/15 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang