PHP生成验证码时“图像因其本身有错无法显示”的解决办法
添加时间:2013-8-8 点击量:
PHP生成验证码时“图像因其本身有错无法显示”的解决办法。
今天应用代码进行PHP生成校验码功能的实现,发明firefox一向提示“图像.......因其本身有错无法显示”的题目,作者也提示了说“若是浏览器显示“图像XXX因其本身有错无法显示”,可尽量去掉文中空格”,但把代码中所有空格都去掉了还是不克不及显示查验。
于是深度google,大项目组的解决规划也是将“<?”这句代码前的空格回车一切都删掉以防止有html输出,但这底子解决不了我的题目,后来看到有人在Header(Content-type: image/PNG);这句代码前应用ob_clean()清除输出,成果一试之下果真成功。现将原代码批改后贴到下面,以备不时之需:
确认码生成文件checkNum_session.php
<?php
//验证码
Header(Content-type: image/png);
/
初始化
/
¥border = 1; //是否要边框 1要:0不要
¥how = 4; //验证码位数
¥w = ¥how15; //宽度
¥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<¥how40; ¥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);
/画图停止/
有关php验证码的内容,大师还可以参考如下的文章:
php验证码 三个实例分享
php自定义大小验证码
php生成扭曲及扭转的验证码
php验证码(GD库生成验证码)的例子
php验证码的例子
php 雪花靠山 验证码
接下来看,确认码调用文件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生成校验码功能的实现,发明firefox一向提示“图像.......因其本身有错无法显示”的题目,作者也提示了说“若是浏览器显示“图像XXX因其本身有错无法显示”,可尽量去掉文中空格”,但把代码中所有空格都去掉了还是不克不及显示查验。
于是深度google,大项目组的解决规划也是将“<?”这句代码前的空格回车一切都删掉以防止有html输出,但这底子解决不了我的题目,后来看到有人在Header(Content-type: image/PNG);这句代码前应用ob_clean()清除输出,成果一试之下果真成功。现将原代码批改后贴到下面,以备不时之需:
确认码生成文件checkNum_session.php
<?php
//验证码
Header(Content-type: image/png);
/
初始化
/
¥border = 1; //是否要边框 1要:0不要
¥how = 4; //验证码位数
¥w = ¥how15; //宽度
¥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<¥how40; ¥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);
/画图停止/
有关php验证码的内容,大师还可以参考如下的文章:
php验证码 三个实例分享
php自定义大小验证码
php生成扭曲及扭转的验证码
php验证码(GD库生成验证码)的例子
php验证码的例子
php 雪花靠山 验证码
接下来看,确认码调用文件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>