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 相关文章推荐
JAVA/JSP学习系列之六
Oct 09 PHP
针对初学PHP者的疑难问答(2)
Oct 09 PHP
php 表单验证实现代码
Mar 10 PHP
一个PHP数组应该有多大的分析
Jul 30 PHP
ThinkPHP php 框架学习笔记
Oct 30 PHP
PHP开发规范手册之PHP代码规范详解
Jan 13 PHP
php excel reader读取excel内容存入数据库实现代码
Dec 06 PHP
解析yii数据库的增删查改
Jun 20 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
PHP架构及原理知识点详解
Dec 22 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中正则表达式的使用方法描述
2008/07/30 PHP
PHP读取XML值的代码(推荐)
2011/01/01 PHP
php遍历数组的方法分享
2012/03/22 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
BootStrap selectpicker
2016/06/20 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
JavaScript实现预览本地上传图片功能完整示例
2019/03/08 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
Python调用微信公众平台接口操作示例
2017/07/08 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
mac使用python识别图形验证码功能
2020/01/10 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
蛋白质世界:Protein World
2017/11/23 全球购物
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
2015年机关后勤工作总结
2015/05/26 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
AJAX实现省市县三级联动效果
2021/10/16 Javascript