класс капчи не работает при расширении другого класса - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть скрипт, использующий класс капчи, подобный этому

<?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();

?>

Недавно на конкретном сервере установка перестала работать, и отображается сообщение «Невозможно отобразить изображение, поскольку оно содержит ошибки.

Странно, что если я удаляю require для example.extended.class.php и удаляю все родительские :: __ construct (), это будет работать нормально. Ну, мы бы подумали, что что-то выводится в ExampleExtended и связывается с заголовками. Правильно я пошел в ExampleExtended и удалил все оттуда. Просто классовая структура, внутри которой ничего нет. Все еще не идти.

Кроме того, точно такой же сценарий хорошо работает на локальном сервере, а также на нескольких производственных серверах ...

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Для отладки удалите вызов 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 содержит правильную косую черту для базовой файловой системы.

0 голосов
/ 07 декабря 2011

Что ж, ради полноты, я отвечу на свой вопрос, на случай, если кто-то может столкнуться с этой проблемой.

То, что происходило, было то, что при вызове второго класса этот файл был открыт исохранено в режиме UTF-8 с спецификацией , но все мои файлы имеют формат UTF-8 без спецификации.

Таким образом, возникла проблема с кодировкой обоих файлов.Все, что мне нужно сделать, это открыть вызываемый класс и преобразовать его в UTF-8 без спецификации , и все!

...