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 setcookie指定domain参数后,在IE下设置cookie失效的解决方法
Sep 09 PHP
PHP中isset()和unset()函数的用法小结
Mar 11 PHP
php中$_GET与$_POST过滤sql注入的方法
Nov 03 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
php提交post数组参数实例分析
Dec 17 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
PHP快速排序算法实现的原理及代码详解
Apr 03 PHP
PHP常见的几种攻击方式实例小结
Apr 29 PHP
php和C#的yield迭代器实现方法对比分析
Jul 17 PHP
thinkphp5+layui实现的分页样式示例
Oct 08 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下读取文本文件的代码
2008/07/02 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
python实现逆波兰计算表达式实例详解
2015/05/06 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
python使用zip将list转为json的方法
2018/12/31 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
学子宴答谢词
2014/01/25 职场文书
招聘与培训专员岗位职责
2014/01/30 职场文书
建筑总经理岗位职责
2014/02/02 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers