如果实例是在类文件之外创建的,则captcha类不会显示图像

时间:2011-10-22 01:39:50

标签: php oop class include captcha

我制作了一个验证码类来生成验证码。出于某种原因,如果我在类文件本身中创建类的实例,我只能显示图像。否则我一无所获。在firebug中,我看到文件被包含但是它被发送为html,尽管我使用了header("Content-type: image/png");
class.captcha.php

<?php
class captcha
{

    public $length=4;
    public $width=150;
    public $height=50;
    public $allowedChar='1234569ACEFGHJKMNPQRSTXZ';
    public $font='Arcade.ttf';
    public $fontSize=25;
    public $fontRed=0;
    public $fontGreen=0;
    public $fontBlue=104;
    public $backgroundRed=204;
    public $backgroundGreen=204;
    public $backgroundBlue=255;
    public $noiseRed=0;
    public $noiseGreen=0;
    public $noiseBlue=104;
    public $noisePercent=5;

    /*
    ** @RETURN IMAGE raw image of captcha
    */
    public function create($name)
    {
        //string
        for ($i=0;$i<$this->length;$i++) 
        {$captcha.= $this->allowedChar[mt_rand(0, strlen($this->allowedChar))];}

        //image
        $img=imagecreatetruecolor($this->width, $this->height);
        //colors
        $bgColor=imagecolorallocate($img, $this->backgroundRed, $this->backgroundGreen, $this->backgroundBlue);
        $fontColor=imagecolorallocate($img, $this->fontRed, $this->fontGreen, $this->fontBlue);
        $noiseColor=imagecolorallocate($img, $this->noiseRed, $this->noiseGreen, $this->noiseBlue);
        imagefilledrectangle($img,0,0,$this->width+1,$this->height+1,$bgColor);
        //text
        for($i=0;$i<strlen($captcha);$i++)
        {
            $rotate=rand(0, 80)-40;
            $offX=$i*$this->fontSize+rand($this->fontSize, $this->fontSize*1.2);
            $offY=$this->fontSize+rand($this->fontSize/2, $this->fontSize);;
            $letter=$captcha[$i];
            imagettftext($img, $this->fontSize, $rotate, $offX, $offY, $fontColor, $this->font, $letter);
        }
        //add noise
        for($i=0;$i<$this->height*$this->width*($this->noisePercent/100);$i++)
        {
            //noise
            $x=rand(0, $this->width);
            $y=rand(0, $this->height);
            imagesetpixel($img, $x, $y, $noiseColor);
        }
        $_SESSION[$name]=md5($captcha);
        return $img;
    }
}
?>


captcha.contact.php

<?php
session_start(); 
include('class.captcha.php');
$c=new captcha;
header("Content-type: image/png"); 
imagepng($c->create('contactCaptcha'));
?>

如果有帮助,请链接到上方http://yamikowebs.com/_test/_php/class.captcha.php 错误是The image “http://yamikowebs.com/_test/_php/captcha.contact.php” cannot be displayed because it contains errors.
如果我将capture.contact.php的内容放在class.captcha.php的末尾,那就没问题了。

2 个答案:

答案 0 :(得分:1)

我认为解决方案可能是您正在使用PHP的结束标记:

?>

它们不是必需的,但有时是有害的。如果此类标记后面有任何符号,则不会发送您尝试发送的标题,并且可能会显示通知(取决于error_reporting设置)。

只需删除结束标记(?>,这应该没问题。

另外一件事 - 如果脚本需要某些工作(例如您的类文件),请使用require()代替include()

答案 1 :(得分:0)

contact.captcha.php

<?php
include('class.captcha.php');
$c=new captcha;
header("Content-type: image/png"); 
imagepng($c->create('contactCaptcha'));
?>

session_start()会发送标题信息,因此一旦删除它就会开始正常工作。