验证码无法显示,〜求大神看看

qq_22213143 2014-10-20 01:55:17
<?php
//验证码类
class ValidateCode {
private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789'; //随机因子
private $code; //验证码
private $codelen = 4; //验证码长度
private $width = 130; //宽度
private $height = 50; //高度
private $img; //图形资源句柄
private $font; //指定的字体
private $fontsize = 20; //指定字体大小
private $fontcolor; //指定字体颜色

//构造方法初始化
public function __construct() {
$this->font = ROOT_PATH.'/font/elephant.ttf';
}

//生成随机码
private function createCode() {
$_len = strlen($this->charset)-1;
for ($i=0;$i<$this->codelen;$i++) {
$this->code .= $this->charset[mt_rand(0,$_len)];
}
}

//生成背景
private function createBg() {
$this->img = imagecreatetruecolor($this->width, $this->height);
$color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));
imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);
}

//生成文字
private function createFont() {
$_x = $this->width / $this->codelen;
for ($i=0;$i<$this->codelen;$i++) {
$this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);
}
}

//生成线条、雪花
private function createLine() {
for ($i=0;$i<6;$i++) {
$color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
}
for ($i=0;$i<100;$i++) {
$color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);
}
}

//输出
private function outPut() {
header('Content-type:image/png');
imagepng($this->img);
imagedestroy($this->img);
}

//对外生成
public function doimg() {
$this->createBg();
$this->createCode();
$this->createLine();
$this->createFont();
$this->outPut();
}

//获取验证码
public function getCode() {
return strtolower($this->code);
}
}
?>

单独建一个文件显示是正常的,放到mvc模式下的方法中显示图片就xx了。
正常的:
<?php
define('ROOT_PATH', dirname(__FILE__));
require './core/ValidateCode.class.php'; //先把类包含进来,实际路径根据实际情况进行修改。
$_vc = new ValidateCode(); //实例化一个对象
$_vc->doimg();
$_SESSION['code'] = $_vc->getCode();//验证码保存到SESSION中
?>

显示x的:
<?php

class UsersController extends Controller {

public function login(){
$this->smarty->display( 'login.html' );
}

public function verifi(){
$_vc = new ValidateCode(); //实例化一个对象
$_vc->doimg();
//$_SESSION['code'] = $_vc->getCode();//验证码保存到SESSION中
}

}

?>
...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
智商众筹 2014-10-20
  • 打赏
  • 举报
回复
有2个建议 1是所有的PHP文件结尾不要加?> 这样后面的空格就不会被include成实际的html输出 2是检查所有文件去掉BOM
傲雪星枫 2014-10-20
  • 打赏
  • 举报
回复
有空白输出不行的,可以试试验在输出之前加 ob_clean();
qq_22213143 2014-10-20
  • 打赏
  • 举报
回复
解决了,输出验证码前有一段空白的输出~~
xuzuning 2014-10-20
  • 打赏
  • 举报
回复
如果在公网上,请给出 url 否则只能自己用过 file_get_contents 查看了
qq_22213143 2014-10-20
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
你的 $_vc->doimg(); 输出的是图片数据流 所以无论在哪里都不能有其他输出
我在php.ini中都设置display_errors = off 了,还是显示 xx... 有没有什么办法捕捉程序中的输出。
xuzuning 2014-10-20
  • 打赏
  • 举报
回复
你的 $_vc->doimg(); 输出的是图片数据流 所以无论在哪里都不能有其他输出
qq_22213143 2014-10-20
  • 打赏
  • 举报
回复
单独建一个文件显示是正常的,放到mvc模式下的方法中显示图片就xx了。

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧