Maison >développement back-end >tutoriel php >PHP 验证码不显示问题
描述你的问题 GD库已经打开,搜索看了其他朋友的解决办法:清除BOM、ob_clean()、代码起始位置不换行还是不显示。
贴上相关代码
<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>
描述你的问题 GD库已经打开,搜索看了其他朋友的解决办法:清除BOM、ob_clean()、代码起始位置不换行还是不显示。
贴上相关代码
<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个参数 还有没看懂你上面
这一点没明白你的意思是要干啥下面也看到调用的地方 注释之后
结果是这个
查看error log,再判断
header('Content-Type:image/png');
要从其他地方查看,从framework所有的文件进行DOM头排查
你先试试复制一些网上成功的代码试试看,如果能成功那么就是你代码的问题,不然就应该是环境的问题。
是不是没安装GD?检查phpinfo()
在header()前清理输出缓冲区,
<code>ob_clean() header('Content-Type:image/png'); imagepng($_img);</code>
最终生成的验证码是酱紫,
那么问题来了,
1、为什么ob_clean()
要加在imagepng()
之前?
显然,header()
之前的代码都不会被缓存到ob,真正缓存到ob的是imagepng()
生成的验证码,当你在浏览器刷新时,ob_clean()
会为你清除前一次保存在ob的验证码。然后imagepng()
再次生成验证码保存到ob,ob随后丢到程序缓存打包到浏览器。
2、假如没有ob_clean()
,按理说也会生成一张验证码,验证码跑到哪里了?
请使用php5.4以下版本或者关闭ob。
Ps:php5.3之后,ob_start()
默认开启,重复添加ob_start()
会导致ob_end_*()
失效。(Oops..在本地编辑代码ob_start重复则出错,然而看到某个上传类却能完好运行。谁知道请详解一下。)
先谢谢帮修改代码高亮的朋友,改了几次高亮都不行,第一次用。回去试试。