PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2023-06-13 09:15:04 时间
今天使用代码进行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
<spanstyle="font-size:14px;"><?php
session_start();
//在页首先要开启session,
//error_reporting(2047);
session_destroy();
//将session去掉,以每次都能取新的session值;
//用seesion效果不错,也很方便
?>
<html>
<head>
<title>session图片验证实例</title>
</head>
<body>
此例为session验证实例
<formaction=""method="post">
验证码:<inputtype="text"name="validate"value=""size=10><imgsrc="checkNum_session.php"><br>
<inputtype="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"<fontcolor=red>输入有误</font>";
}else{
echo"<fontcolor=green>通过验证</font>";
}
}
/*
//打印全部session;
PrintArr($_SESSION);
functionPrintArr($aArray){
echo"<xmp>";
print_r($aArray);
echo"</xmp>";
}
*/
?></span>
相关文章
- PHP脚本内存泄露导致Apache频繁宕机解决方法
- Linux下使用PHP开发软件的简易指南(linux下php开发)
- PHP连接MySQL数据库指南(php连接到mysql)
- 远程探索——PHP与MySQL的结合(php远程连接mysql)
- 实现PHP程序Redis连接池的简单方法(redis连接池php)
- PHP与MSSQL的快速无缝连接配置指南(php链接mssql配置)
- Linux查看PHP版本的方法简介(linux查看php版本)
- IIS6中配置PHP的方法200911
- PHP数组内存耗用太多问题的解决方法
- PHP生成excel时单元格内换行问题的解决方法
- 使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
- 基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
- PHP反射类ReflectionClass和ReflectionObject的使用方法
- php下载excel无法打开的解决方法
- PHP字符串长度判断效率更高的方法
- php使用Cookie实现和用户会话的方法
- DOM基础及php读取xml内容操作的方法
- php出现内存位置访问无效错误问题解决方法
- PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
- PHP中使用localhost连接Mysql不成功的解决方法
- PHP提示Deprecated:mysql_connect():Themysqlextensionisdeprecated的解决方法
- PHP处理JSON字符串key缺少双引号的解决方法
- PHP正则表达式替换站点关键字链接后空白的解决方法