|
|
|
| Сам скрипт взят из книги Максима Кузнецова и Игоря Симдянова "Объектно-Ориентированное Программирование" страница 60-61 Глава 2.11
вот его содержимое:
<?php
// Подключаем объявление класса
require_once("class/class.point.php");
// Массив объектов point
$arr = array(point::get_point(1, 1),
point::get_point(2, 2),
point::get_point(3, 0),
point::get_point(4, 5));
// Определяем минимальное и максимальное
// значения по оси абсцисс (X) и ординат (Y)
$x_min = $x_max = $arr[0]->get_x();
$y_min = $y_max = $arr[0]->get_y();
for($i = 0; $i < count($arr); $i++)
{
if($x_min > $arr[$i]->get_x()) $x_min = $arr[$i]->get_x();
if($x_max < $arr[$i]->get_x()) $x_max = $arr[$i]->get_x();
if($y_min > $arr[$i]->get_y()) $y_min = $arr[$i]->get_y();
if($y_max < $arr[$i]->get_y()) $y_max = $arr[$i]->get_y();
}
// Размер выводимого изображения
$height = 100; // высота
$width = 100; // ширина
// Создаем полноцветное изображение
$img = imagecreatetruecolor($width, $width);
if (!$img) exit("Ошибка создания изображения");
// Определяем черный цвет
$black = imagecolorallocate($img, 0, 0, 0);
// Определяем белый цвет
$white = imagecolorallocate($img, 255, 255, 255);
// Заливаем белым цветом фон изображения
imagefill($img, 0, 0, $white);
// Рисуем ломанную
for($i = 0; $i < count($arr) - 1; $i++)
{
$x1 = ($arr[$i]->get_x() - $x_min)*$width/($x_max - $x_min);
$y1 = ($y_max - $arr[$i]->get_y())*$height/($y_max - $y_min);
$x2 = ($arr[$i + 1]->get_x() - $x_min)*$width/($x_max - $x_min);
$y2 = ($y_max - $arr[$i + 1]->get_y())*$height/($y_max - $y_min);
imageline($img, $x1, $y1, $x2, $y2, $black);
}
// Выводим изображение в окно браузера
header("Content-type: " .image_type_to_mime_type(IMAGETYPE_PNG));
imagepng($img);
?>
|
вот содержимое файла класса point:
<?php
// Выставляем уровень обработки ошибок
error_reporting(E_ALL & ~E_NOTICE);
class point
{
// Открытый интерфейс класса
public function get_point($X, $Y)
{
$obj = new point();
$obj->set_point($X, $Y);
return $obj;
}
public function get_X()
{
return $this->X;
}
public function get_Y()
{
return $this->Y;
}
// Закрытые члены и методы класса
private $X;
private $Y;
private function set_point($X, $Y)
{
$this->X = $X;
$this->Y = $Y;
}
}
?>
|
Описание проблемы:
выдается ошибка:
Warning: Cannot modify header information - headers already sent by (output started at /home/p/prohorow/public_html/index2.php:10) in /home/p/prohorow/public_html/index2.php on line 63
перевел как:
Предупреждение: Не удается изменить информацию в заголовке - заголовки уже прислал (выход начался в / home/p/prohorow/public_html/index2.php: 10) в / home/p/prohorow/public_html/index2.php на линии 63
Файл класса закачен в корневую директорию, строка 63 начинается в index2.php начинается с встроенной функции использующую библиотеку GDLib для построения ломанной линии:
header("Content-type: " .image_type_to_mime_type(IMAGETYPE_PNG));
|
координаты узлов которой хранятся в массиве объектов который описан в строках 55-59.
Не могу понять где я ошибся, проверил код, все полностью совпадает с оригиналом в книге.
На одном из форумов мне ответили следующие:
Принцип работы веб-сервера не позволяет выводить заголовки дважды, если веб сервер получает html информацию то далее использовать функцию header(); использовать нет возможности, избежать этого можно используя функцию ob_start() , для примера внесли изменения в указанный скрипт, проверьте теперь вывод.
вот полное содержимое файла:
<?php ob_start() ?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Документ без названия</title>
</head>
<body>
<?php
// Выставляем уровень обработки ошибок
error_reporting(E_ALL & ~E_NOTICE);
// Подключаем объявление класса
require_once("class.point.php");
// Массив объектов point
$arr = array(point::get_point(1, 1),
point::get_point(2, 2),
point::get_point(3, 0),
point::get_point(4, 5));
// Определяем минимальное и максимальное
// значения по оси абсцисс (X) и ординат (Y)
$x_min = $x_max = $arr[0]->get_x();
$y_min = $y_max = $arr[0]->get_y();
for($i = 0; $i < count($arr); $i++)
{
if($x_min > $arr[$i]->get_x()) $x_min = $arr[$i]->get_x();
if($x_max < $arr[$i]->get_x()) $x_max = $arr[$i]->get_x();
if($y_min > $arr[$i]->get_y()) $y_min = $arr[$i]->get_y();
if($y_max < $arr[$i]->get_y()) $y_max = $arr[$i]->get_y();
}
// Размер выводимого изображения
$height = 100; // высота
$width = 100; // ширина
// Создаем полноцветное изображение
$img = imagecreatetruecolor($width, $width);
if (!$img) exit("Ошибка создания изображения");
// Определяем черный цвет
$black = imagecolorallocate($img, 0, 0, 0);
// Определяем белый цвет
$white = imagecolorallocate($img, 255, 255, 255);
// Заливаем белым цветом фон изображения
imagefill($img, 0, 0, $white);
// Рисуем ломанную
for($i = 0; $i < count($arr) - 1; $i++)
{
$x1 = ($arr[$i]->get_x() - $x_min)*$width/($x_max - $x_min);
$y1 = ($y_max - $arr[$i]->get_y())*$height/($y_max - $y_min);
$x2 = ($arr[$i + 1]->get_x() - $x_min)*$width/($x_max - $x_min);
$y2 = ($y_max - $arr[$i + 1]->get_y())*$height/($y_max - $y_min);
imageline($img, $x1, $y1, $x2, $y2, $black);
}
// Выводим изображение в окно браузера
header("Content-type: " .image_type_to_mime_type(IMAGETYPE_PNG));
imagepng($img);
?>
</body>
</html>
<?php ob_end_flush();?>
|
разместил все это на живом хостинге теперь ругается так:
"Изображение http://****/index.php не может быть показано, так как содержит ошибки"
приехали, я в ступоре помогите кто может.
На локальном сервере денвер:
Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.2.12 Server at localhost Port 80
ошибка та же. | |
|
|
|
|
|
|
|
для: АндрейПро
(23.05.2013 в 15:13)
| | До любой отправки хэдера на экран не должно выводится никаких данных.
А у вас это происходит. Типичная ошибка.
Решение: найти место где происходит вывод. У вас это до тэга <?php могут выводится переносы строк, а не должно быть ничего. Также нужно вообще удалить закрывающийся тэг ?> во избежания последующих ошибок, потому что после могут быть пробелы или переносы, чего быть не должно.
Тогда всё заработает.
Никаких html-тэгов и прочего быть не должно. Это картинка.
Файлы скрипта должны быть сохранены в кодировке без BOM.
Хотите вывести картинку на html-странице - используйте скрипт так:
<img src="img.php" /> | |
|
|
|
|
|
|
|
для: DangerBay
(23.05.2013 в 15:53)
| | Уважаемый DangerBay!!!
Спасибо, помогло.
Не знал, что можно скрипт выводить без оформления html тегами.
Сколько учился, прочел книг, нигде об этом ни слова не сказано. | |
|
|
|
|