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 相关文章推荐
PHPLog php 程序调试追踪工具
Sep 09 PHP
PHP遍历二维数组的代码
Apr 22 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
PHP中Memcache操作类及用法实例
Dec 12 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
PHP中的use关键字及文件的加载详解
Nov 28 PHP
php查询及多条件查询
Feb 26 PHP
PC端微信扫码支付成功之后自动跳转php版代码
Jul 07 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中使用Oracle数据库(5)
2006/10/09 PHP
php调用mysql数据 dbclass类
2011/05/07 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
PHP中Array相关函数简介
2016/07/03 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
ASP Json Parser修正版
2009/12/06 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
Angular实现可删除并计算总金额的购物车功能示例
2017/12/26 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
用python写的一个wordpress的采集程序
2016/02/27 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
python实现排序算法解析
2018/09/08 Python
基于python实现学生管理系统
2018/10/17 Python
工程师自我评价怎么写
2013/09/19 职场文书
体育教育个人自荐信范文
2013/12/01 职场文书
保安拾金不昧表扬信
2014/01/15 职场文书
运动会100米解说词
2014/01/23 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
保险公司演讲稿
2014/09/02 职场文书
具结保证书
2015/01/17 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书