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 缓冲的免费实现方法
Oct 09 PHP
用PHP和ACCESS写聊天室(九)
Oct 09 PHP
smarty静态实验表明,网络上是错的~呵呵
Nov 25 PHP
PHP程序员最常犯的11个MySQL错误小结
Nov 20 PHP
easyui的tabs update正确用法分享
Mar 21 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
Jul 15 PHP
php实现统计网站在线人数的方法
May 12 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
php基于CodeIgniter实现图片上传、剪切功能
May 14 PHP
YII2框架中使用yii.js实现的post请求
Apr 09 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 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
基于mysql的论坛(3)
2006/10/09 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
PHP插入排序实现代码
2013/04/04 PHP
ThinkPHP分页实例
2014/10/15 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
jquery 学习笔记一
2010/04/07 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
小程序实现录音功能
2020/09/22 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
python实现log日志的示例代码
2018/04/28 Python
Python中Numpy mat的使用详解
2019/05/24 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
python科学计算之narray对象用法
2019/11/25 Python
Python 如何反方向迭代一个序列
2020/07/28 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
大学生求职信
2014/06/17 职场文书
高中历史教学反思
2016/02/19 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android