我有一个使用像这样的验证码类的脚本
<?php
@session_start();
require str_replace('\\','/',dirname(__FILE__)) . "/example.extended.class.php";
class Ccaptcha extends ExampleExtended {
private $color1;
private $color2;
private $color3;
private $bgcolor;
private $bg_transparent = true;
private $final_width;
public function __construct() {
parent::__construct();
$this->final_width = $this->captcha_width;
$this->color1 = $this->captcha_color1;
$this->color2 = $this->captcha_color2;
$this->color3 = $this->captcha_color3;
$this->bgcolor = $this->captcha_colorbg;
}
public function CreateCaptcha() {
// generate random number
$randomnr = rand(1000, 9999);
// MD5 it and store in session
$_SESSION['commax_random_number'] = md5($randomnr);
// Generate image
$im = imagecreatetruecolor(200, 200);
imagesavealpha($im, true);
$color_1 = imagecolorallocate($im, 120, 180, 240);
$color_2 = imagecolorallocate($im, 120, 180, 240);
$color_3 = imagecolorallocate($im, 120, 180, 240);
$background = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagefill($im, 0, 0, $background);
imagestring($im, 100, 50, 50, $randomnr, $color_3);
// prevent client side caching
header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
//send image to browser
header ("Content-type: image/png");
imagepng($im);
imagedestroy($im);
}
}
$captcha = new Ccaptcha();
$captcha->CreateCaptcha();
?>
最近在特定的服务器上安装它停止工作,并显示一条消息“图片无法显示,因为它包含错误。
奇怪的是,如果我删除example.extended.class.php的require并删除所有的parent :: __ construct(),它就可以了。好吧,我们会认为在ExampleExtended中输出了一些东西并且弄乱了标题。我去了ExampleExtended并从那里删除了所有内容。只是一个没有内部的类结构。仍然没有。
此外,完全相同的脚本在本地服务器上以及在少数生产服务器上运行良好......
答案 0 :(得分:1)
要调试此操作,请删除对header ("Content-type: image/png");
的调用,以便您可以查看系统发出的错误。您需要确保启用错误报告,如下所示:
ini_set('error_reporting', E_ALL);
ini_set('display_errors', true);
我也不会这样做:
require str_replace('\\','/',dirname(__FILE__)) . "/example.extended.class.php";
但试试这个:
require dirname(__FILE__) . DIRECTORY_SEPARATOR . 'example.extended.class.php';
DIRECTORY_SEPARATOR
包含底层文件系统的正确斜杠。
答案 1 :(得分:0)
为了完整起见,我会回答我自己的问题,万一有人可能碰到这个问题。
发生的事情是,在调用第二个类时,该文件已经打开并以 UTF-8模式与BOM 保存,但我的所有文件都是UTF-8而没有BOM。
因此两个文件都存在编码问题。我所要做的就是打开被叫类并将其转换为 UTF-8,无需BOM ,就是这样!