Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не работает скрипт
 
 автор: АндрейПро   (23.05.2013 в 15:13)   письмо автору
 
 

Сам скрипт взят из книги Максима Кузнецова и Игоря Симдянова "Объектно-Ориентированное Программирование" страница 60-61 Глава 2.11
вот его содержимое:
<?php                           
                                                      
                              
// Подключаем объявление класса
                              
require_once("class/class.point.php");
                            
                              
// Массив объектов point
                               
$arr = array(point::get_point(11),
                               
point::get_point(22),
                               
point::get_point(30),
                               
point::get_point(45));

                              
// Определяем минимальное и максимальное 
                              // значения по оси абсцисс (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($img000);
                                
                              
// Определяем белый цвет    
                              
$white imagecolorallocate($img255255255);
                              
                              
// Заливаем белым цветом фон изображения
                              
imagefill($img00$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;
      
$this->$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(11),
                               
point::get_point(22),
                               
point::get_point(30),
                               
point::get_point(45));

                              
// Определяем минимальное и максимальное 
                              // значения по оси абсцисс (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($img000);
                                
                              
// Определяем белый цвет    
                              
$white imagecolorallocate($img255255255);
                              
                              
// Заливаем белым цветом фон изображения
                              
imagefill($img00$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

ошибка та же.

  Ответить  
 
 автор: DangerBay   (23.05.2013 в 15:53)   письмо автору
 
   для: АндрейПро   (23.05.2013 в 15:13)
 

До любой отправки хэдера на экран не должно выводится никаких данных.
А у вас это происходит. Типичная ошибка.
Решение: найти место где происходит вывод. У вас это до тэга <?php могут выводится переносы строк, а не должно быть ничего. Также нужно вообще удалить закрывающийся тэг ?> во избежания последующих ошибок, потому что после могут быть пробелы или переносы, чего быть не должно.
Тогда всё заработает.
Никаких html-тэгов и прочего быть не должно. Это картинка.
Файлы скрипта должны быть сохранены в кодировке без BOM.
Хотите вывести картинку на html-странице - используйте скрипт так:
<img src="img.php" />

  Ответить  
 
 автор: АндрейПро   (23.05.2013 в 17:04)   письмо автору
 
   для: DangerBay   (23.05.2013 в 15:53)
 

Уважаемый DangerBay!!!
Спасибо, помогло.
Не знал, что можно скрипт выводить без оформления html тегами.
Сколько учился, прочел книг, нигде об этом ни слова не сказано.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования