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短域名转换为实际域名函数
Jan 17 PHP
PHP 八种基本的数据类型小结
Jun 01 PHP
PHP file_exists问题杂谈
May 07 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
限制ckeditor上传图片文件大小的方法
Nov 15 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
PHP页面跳转实现延时跳转的方法
Dec 10 PHP
php封装json通信接口详解及实例
Mar 07 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 PHP
Laravel如何实现自动加载类
Oct 14 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文件读写操作之文件读取方法详解
2011/01/13 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
PHP封装的HttpClient类用法实例
2015/06/17 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
python查询mysql中文乱码问题
2014/11/09 Python
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
Python random模块用法解析及简单示例
2017/12/18 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
python爬取天气数据的实例详解
2020/11/20 Python
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
专科毕业生学习生活的自我评价
2013/10/26 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
大学毕业感言100字
2014/02/03 职场文书
专项法律服务方案
2014/06/11 职场文书
单位活动策划方案
2014/08/17 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书