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 相关文章推荐
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
加强版phplib的DB类
Mar 31 PHP
10条PHP编程习惯助你找工作
Sep 29 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
PHP采集腾讯微博的实现代码
Jan 19 PHP
PHP的简易冒泡法代码分享
Aug 28 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
Jun 20 PHP
php 地区分类排序算法
Jul 01 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 PHP
thinkPHP简单调用函数与类库的方法
Mar 15 PHP
PHP实现的多维数组排序算法分析
Feb 10 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服务器页面间跳转实现方法
2012/08/02 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
javascript读取xml
2006/11/04 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
2016/01/27 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
常用的javascript设计模式
2017/01/11 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
vue.js $refs和$emit 父子组件交互的方法
2017/12/20 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
介绍Python的Django框架中的QuerySets
2015/04/20 Python
python实现折半查找和归并排序算法
2017/04/14 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
Python jieba库用法及实例解析
2019/11/04 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
python实现单机五子棋
2020/08/28 Python
python实现感知机模型的示例
2020/09/30 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
Python自动化测试基础必备知识点总结
2021/02/07 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
护士在校生自荐信
2014/02/01 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
四查四看整改措施
2014/09/19 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
孟佩杰观后感
2015/06/17 职场文书
借钱欠条怎么写
2015/07/03 职场文书
MySQL快速插入一亿测试数据
2021/06/23 MySQL