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的header和asp中的redirect比较
Oct 09 PHP
PHP 输出缓存详解
Jun 20 PHP
PHP 开发环境配置(Zend Studio)
Apr 28 PHP
php环境无法上传文件的解决方法
Apr 30 PHP
PHP函数getenv简介和使用实例
May 12 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
Feb 23 PHP
全面了解PHP中的全局变量
Jun 17 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 27 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
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
详解js异步文件加载器
2016/01/24 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
JS模拟实现京东快递单号查询
2020/11/30 Javascript
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
Pureology官网:为染色头发打造最好的产品
2019/09/13 全球购物
如何强制垃圾回收
2015/10/06 面试题
婚礼司仪主持词
2014/03/14 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
《叶问2》观后感
2015/06/15 职场文书
李强感恩观后感
2015/06/17 职场文书
委托收款证明
2015/06/23 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书