有个这样的问题,关于验证码显示不了,我这边 php.ini文件中extention=php.gd2.dll这文件都打开了,但是还是显示不了,有人回答一下不 验证码 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 $_nmsg = ''; //可能是少了这句for ($i=0;$i<$_rnd_code;$i++) {$_nmsg .= dechex(mt_rand(0,15));} <?php $_width = 75; $_height = 25; $_rnd_code = 4; $_flag = false;$_nmsg = ''; //加上这个for ($i=0;$i<$_rnd_code;$i++) {$_nmsg .= dechex(mt_rand(0,15));}......排错方法:注释掉 header('Content-Type: image/png');//输出图像//header('Content-Type: image/png');imagepng($_img);就可以看到错误信息即 $_nmsg .= dechex(mt_rand(0,15)); 时$_nmsg 没有初值,所以会用警告使用 error_reporting(0) ; 是自欺欺人的,并不能消除隐患何况位置也放错了 这段代码之前是否有其他html输出或空格之类的?如果没有在试下在前面加个session_start(); 看看 感觉是不是没有问题了,后来百度发现一高人说关键是加入了ob_clean,了这个让我想了原因。解决办法在header之前加入这个代码就行了ob_clean(); //关键代码,防止出现'图像因其本身有错无法显示'的问题。 那是因为你的程序文件有 BOM 头加上 ob_clean(); 也是在回避矛盾 <?php $_width = 75; $_height = 25; $_rnd_code = 4; $_flag = false; $_nmsg = '';for ($i=0;$i<$_rnd_code;$i++) {$_nmsg .= dechex(mt_rand(0,15));}/** $authnum=''; //生成验证码字符 $ychar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"; $list=explode(",",$ychar);//使用分隔符存储到数组中 for($i=0;$i<4;$i++){ $randnum=rand(0,35); $_nmsg.=$list[$randnum]; } *///保存在session$_SESSION['code'] = $_nmsg;//创建一张图像$_img = imagecreatetruecolor($_width,$_height);//白色$_white = imagecolorallocate($_img,255,255,255);//填充imagefill($_img,0,0,$_white);if ($_flag) {//黑色,边框$_black = imagecolorallocate($_img,0,0,0);imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);}//随即画出6个线条for ($i=0;$i<6;$i++) {$_rnd_color = imagecolorallocate($_img,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);}//随即雪花for ($i=0;$i<100;$i++) {$_rnd_color = imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),'*',$_rnd_color);}//输出验证码for ($i=0;$i<strlen($_SESSION['code']);$i++) {$_rnd_color = imagecolorallocate($_img,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200));imagestring($_img,5,$i*$_width/$_rnd_code+mt_rand(1,10),mt_rand(1,$_height/2),$_SESSION['code'][$i],$_rnd_color);}error_reporting(0) ;//输出图像header('Content-Type: image/png');imagepng($_img);//销毁imagedestroy($_img);?> 求助!php能include jsp文件吗?在线等!!! 关于一个计数器的小程序问题 关于php5里面的activescript dll文件 当只有一个数据时,要while读取吗? 众多同仁帮忙测试以下三个站点的网速,注明您的地点和网络 获取POST的值问题? PHP菜菜求助 在线等,网页如何判断客户端是安卓还是IOS系统? php做的udp端口信号接收服务端程序,发现端口被30秒后自动关停? 菜鸟求指点:Linux系统上建一个可界面查询的数据库,需要用到哪些技术? 那个大神帮帮忙! 新版的zend studio11.0创建PHP文件没有结尾的标示符
for ($i=0;$i<$_rnd_code;$i++) {
$_nmsg .= dechex(mt_rand(0,15));
}
$_width = 75;
$_height = 25;
$_rnd_code = 4;
$_flag = false;
$_nmsg = ''; //加上这个
for ($i=0;$i<$_rnd_code;$i++) {
$_nmsg .= dechex(mt_rand(0,15));
}
......排错方法:
注释掉 header('Content-Type: image/png');
//输出图像
//header('Content-Type: image/png');
imagepng($_img);
就可以看到错误信息即 $_nmsg .= dechex(mt_rand(0,15)); 时
$_nmsg 没有初值,所以会用警告使用 error_reporting(0) ; 是自欺欺人的,并不能消除隐患
何况位置也放错了
解决办法
在header之前加入这个代码就行了
ob_clean(); //关键代码,防止出现'图像因其本身有错无法显示'的问题。
加上 ob_clean(); 也是在回避矛盾
$_width = 75;
$_height = 25;
$_rnd_code = 4;
$_flag = false;
$_nmsg = '';
for ($i=0;$i<$_rnd_code;$i++) {
$_nmsg .= dechex(mt_rand(0,15));
}
/**
$authnum='';
//生成验证码字符
$ychar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
$list=explode(",",$ychar);//使用分隔符存储到数组中
for($i=0;$i<4;$i++){
$randnum=rand(0,35);
$_nmsg.=$list[$randnum];
}
*/
//保存在session
$_SESSION['code'] = $_nmsg;//创建一张图像
$_img = imagecreatetruecolor($_width,$_height);//白色
$_white = imagecolorallocate($_img,255,255,255);//填充
imagefill($_img,0,0,$_white);if ($_flag) {
//黑色,边框
$_black = imagecolorallocate($_img,0,0,0);
imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);
}//随即画出6个线条
for ($i=0;$i<6;$i++) {
$_rnd_color = imagecolorallocate($_img,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);
}//随即雪花
for ($i=0;$i<100;$i++) {
$_rnd_color = imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),'*',$_rnd_color);
}//输出验证码
for ($i=0;$i<strlen($_SESSION['code']);$i++) {
$_rnd_color = imagecolorallocate($_img,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200));
imagestring($_img,5,$i*$_width/$_rnd_code+mt_rand(1,10),mt_rand(1,$_height/2),$_SESSION['code'][$i],$_rnd_color);
}
error_reporting(0) ;
//输出图像
header('Content-Type: image/png');
imagepng($_img);//销毁
imagedestroy($_img);
?>