Home >Backend Development >PHP Tutorial >PHP 验证码不显示问题

PHP 验证码不显示问题

WBOY
WBOYOriginal
2016-06-06 20:13:44977browse

  1. 描述你的问题 GD库已经打开,搜索看了其他朋友的解决办法:清除BOM、ob_clean()、代码起始位置不换行还是不显示。

  2. 贴上相关代码

<code><?php session_start();
//创建随机验证码
for ($i=0;$i<4;$i++){
    $_nmsg .= dechex(mt_rand(0,15));
}
//随机码保存在session
$_SESSION['code']=$_nmsg;
//长高
$_width = 75;
$_height = 25;
//创建图像
$_img = imagecreatetruecolor($_width,$_height);
//
$_white = imagecolorallocate($_img,255,255,255);
//填充
imagefill($_img,0,0,$_white);
//黑色边框
$_black = imagecolorallocate($_img,0,0,0);
imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);
//随机下划线
for($i=0;$i<6;$i++){
    $_rnd_color = imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255),mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
    imageline($_img,mt_rand(0,$_width), mt_rand(0,$_height), mt_rand(0,$_width), mt_rand(0,$_height), $_rnd_color);
}
//输出图像
header('Content-Type:image/png');
imagepng($_img);
//删除图像 
imagedestroy($_img);

?></code>

回复内容:

  1. 描述你的问题 GD库已经打开,搜索看了其他朋友的解决办法:清除BOM、ob_clean()、代码起始位置不换行还是不显示。

  2. 贴上相关代码

<code><?php session_start();
//创建随机验证码
for ($i=0;$i<4;$i++){
    $_nmsg .= dechex(mt_rand(0,15));
}
//随机码保存在session
$_SESSION['code']=$_nmsg;
//长高
$_width = 75;
$_height = 25;
//创建图像
$_img = imagecreatetruecolor($_width,$_height);
//
$_white = imagecolorallocate($_img,255,255,255);
//填充
imagefill($_img,0,0,$_white);
//黑色边框
$_black = imagecolorallocate($_img,0,0,0);
imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);
//随机下划线
for($i=0;$i<6;$i++){
    $_rnd_color = imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255),mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
    imageline($_img,mt_rand(0,$_width), mt_rand(0,$_height), mt_rand(0,$_width), mt_rand(0,$_height), $_rnd_color);
}
//输出图像
header('Content-Type:image/png');
imagepng($_img);
//删除图像 
imagedestroy($_img);

?></code>

经过测试,你的代码问题在这里:
在实现随机下划线的时候,imagecolorallocate这个函数传入的参数不对,应该给予4个params,现在的代码给了6个参数。
结果:修改后,验证码显示没有问题,可以正常输出。

这里的imagecolorallocate应该是传4个参数 还有没看懂你上面PHP 验证码不显示问题

这一点没明白你的意思是要干啥下面也看到调用的地方 注释之后PHP 验证码不显示问题

结果是这个

PHP 验证码不显示问题

查看error log,再判断

header('Content-Type:image/png');

要从其他地方查看,从framework所有的文件进行DOM头排查

你先试试复制一些网上成功的代码试试看,如果能成功那么就是你代码的问题,不然就应该是环境的问题。

是不是没安装GD?检查phpinfo()

在header()前清理输出缓冲区,

<code>ob_clean()
header('Content-Type:image/png');
imagepng($_img);</code>

最终生成的验证码是酱紫,

PHP 验证码不显示问题

那么问题来了,
1、为什么ob_clean()要加在imagepng()之前?
显然,header()之前的代码都不会被缓存到ob,真正缓存到ob的是imagepng()生成的验证码,当你在浏览器刷新时,ob_clean()会为你清除前一次保存在ob的验证码。然后imagepng()再次生成验证码保存到obob随后丢到程序缓存打包到浏览器。

2、假如没有ob_clean(),按理说也会生成一张验证码,验证码跑到哪里了?
请使用php5.4以下版本或者关闭ob

Ps:php5.3之后,ob_start()默认开启,重复添加ob_start()会导致ob_end_*()失效。(Oops..在本地编辑代码ob_start重复则出错,然而看到某个上传类却能完好运行。谁知道请详解一下。)

先谢谢帮修改代码高亮的朋友,改了几次高亮都不行,第一次用。回去试试。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn