[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Использование функций, проблемы с include()
sergeiss
Прошу подсобить вот в таком вопросе. Продолжаю "воевать" с созданием картинок (графиков). Всё понятно... Но работает очень плохо sad.gif Не могу сделать элементарные вещи, без которых не могу двигаться дальше.
Причем, на Си я бы давно сделал, что мне нужно smile.gif Но - если бы выводил не в браузере, а в отдельном окне. А тут не могу уйти дальше простейших "опытов".

Вот есть такой код, работает "как часы".
Код

<?php header('Content-type: image/jpeg');

$width=500;
$height=600;

$bkcolor=imagecolorallocate( $image, 200, 200, 200);

imagefill( $image, 0, 0, $bkcolor);

imagejpeg( $image );
?>

Но я хочу вынести заполнение фона в отдельную функцию, т.к. я буду проделывать эту же процедуру много раз для создания других картинок. Поэтому пытаюсь использовать include(). Для этого несколько строк пытаюсь вынести в отдельный файл, а основная программа слегка модифицируется.
Вот основная программа, которая просто рисует прямоугольник с надписью "Рисунок".
Код

<?php header('Content-type: image/jpeg');

$width=500;
$height=600;

include_once( "draw_graph_background.inc" );

DrawGraphBackground( $image, $width, $height);

imagejpeg( $image );
?>


А вот то, что находится в файле draw_graph_background.inc - я пробовал передавать $image и по ссылке, и как простую переменную, но результат один и тот же.
Код

function DrawGraphBackground( &$image, $width, $height )
{
$bkcolor=imagecolorallocate( $image, 200, 200, 200);
imagefill( $image, 0, 0, $bkcolor);
}




Спустя 3 минуты, 43 секунды (19.02.2008 - 15:35) vasa_c написал(а):
Локализуйте сначала проблему. Скорее всего непосредственно к картинкам она отношения не имеет.
php-код должен заключаться в php-теги, даже есть это код в подключаемом файле.

Спустя 9 минут, 4 секунды (19.02.2008 - 15:44) sergeiss написал(а):
Цитата(vasa_c @ 19.2.2008, 15:35) [snapback]33969[/snapback]
Локализуйте сначала проблему. Скорее всего непосредственно к картинкам она отношения не имеет.
php-код должен заключаться в php-теги, даже есть это код в подключаемом файле.

М-да... "А ларчик просто открывался"... Действительно, в этом файле тоже нужны были тэги <?php ..... ?>

Афигеть... Но по описанию include() такого вывода не сделаешь.

Спасибо за подсказку! smile.gif И интересно, сколько еще таких "приятных неожиданностей" я еще встречу на пути изучения PHP?

Спустя 1 час, 27 минут, 33 секунды (19.02.2008 - 17:12) Timok написал(а):
Цитата(sergeiss)
И интересно, сколько еще таких "приятных неожиданностей" я еще встречу на пути изучения PHP?

Фишки и мелочи PHP

Спустя 18 часов, 59 минут, 38 секунд (20.02.2008 - 12:11) sergeiss написал(а):
Цитата(Timok @ 19.2.2008, 17:12) [snapback]33979[/snapback]
Цитата(sergeiss)
И интересно, сколько еще таких "приятных неожиданностей" я еще встречу на пути изучения PHP?

Фишки и мелочи PHP

Спасибо за ссылку, но в моем случае она не помогает smile.gif
Я пытаюсь создать картинку на основе данных из БД. Создать просто прямоугольник с фоном я могу. Но вот дальше начинаются проблемы. И я даже не могу понять, что же именно происходит "не так" crying.gif То ли некорректно обращение к БД, то ли еще что-то...
Потому что я не могу вывести никакие контрольные состояния. То есть, в случае ошибки я могу только покинуть скрипт, но не могу вывести никакую контрольную распечатку.
Пытался использовать глобальную переменную, чтобы менять ее состояние по мере работы сбойного скрипта - не получается. Причем, пробовал 2 варианта: объявлял как global и использовал массива $GLOBALS[].
В основной программе:
Код
<?php
$GLOBALS['state'] ="Start";
$state="Start";

echo "<img src=\"lalala.php\" /img><br><br>";

echo "Result = '".$GLOBALS['state'] ."'.<br>";
echo "Result = '".$state . "'.<br>";

?>

И в файле lalala.php
Код
<?php header('Content-type: image/jpeg');

global $state;
$GLOBALS['state']="entered";
$state="entered";

// какой-то текст скрипта, строящий картинку
?>


В результате выполнения получаю контрольный вывод в конце основного скрипта в виде 2-х строк:
Result = 'Start'.
Result = 'Start'.

То есть, после выполнения скрипта lalala.php не происходит изменения переменных sad.gif

Что совсем меня "добивает", это то, что в случае ошибки в скрипте lalala.php я не получаю никаких сообщений об ошибках!!!
Поэтому моя задача - использовать какой-то механизм, позволяющий мне иметь полный контроль над процессом построения картинки, особенно в процессе создания программы. Пока я только тычусь как слепой котенок blush.gif и пытаюсь находить ошибки методом "напряжения мозгов". Которые периодически перегреваются smile.gif, а в целом процесс идет существенно медленнее, чем мне бы хотелось.

Подскажите, что я делаю "не так"? smile.gif Возможно, есть какие-то другие варианты???

Спустя 5 часов, 25 минут, 21 секунда (20.02.2008 - 17:37) Sylex написал(а):
Если я тебя правильно понял, ты просто хочешь передать в твой файл lalala.php данные какие-то? Если передать, используй GET-запрос:

Код
<img src=\"lalala.php?my=blablabla\" /img>


А в lalala.php можешь юзать переменную, она будет содержать "blablabla":

Код
$_GET['my']


А если ты хочешь получить данные ИЗ этого файла, то такой метод не получиться... Тебе можно только подключать файл:
Код
include("lalala.php?my=111")

А в нем условие, если эта переменная содержит есть my=111, то выполнять определенные операции, передавать значения в переменные, иначе - вывод картинки.

Поди не понятно объяснял, просто долго писать, сорри, учисьwink.gif

Спустя 22 минуты, 33 секунды (20.02.2008 - 17:59) sergeiss написал(а):
Цитата(Sylex @ 20.2.2008, 17:37) [snapback]34044[/snapback]
Если я тебя правильно понял, ты просто хочешь передать в твой файл lalala.php данные какие-то? Если передать, используй GET-запрос:

С передачей "туда" проблем нет. Проблема как раз в том, чтобы "оттуда" получить данные. Я не знаю, на каком этапе и какая ошибка произойдет, поэтому хочу менять содержание какой-то глобальной переменной. Как только происходит ошибка, при возвращении в основной скрипт я узнаю, на каком этапе она (ошибка) произошла. Это будет понятно по содержанию глобальной переменной. И даже смогу сам сформировать более подробное описание, которое можно поместить в другую глобальную переменную. Если только они будут работать так, как описано в хэлпе.

Цитата(Sylex @ 20.2.2008, 17:37) [snapback]34044[/snapback]
Поди не понятно объяснял, просто долго писать, сорри, учисьwink.gif

Да я уже, вообще-то, где-то с 1992 (или с 1993-го?) года "учусь" программировать smile.gif Вот за PHP недавно взялся. А на других языках давно уже "учусь".

Спустя 1 час, 36 минут, 47 секунд (20.02.2008 - 19:36) Sylex написал(а):
Цитата
Проблема как раз в том, чтобы "оттуда" получить данные. Я не знаю, на каком этапе и какая ошибка произойдет, поэтому хочу менять содержание какой-то глобальной переменной. Как только происходит ошибка, при возвращении в основной скрипт я узнаю, на каком этапе она (ошибка) произошла. Это будет понятно по содержанию глобальной переменной.


Не знаю какие действия ты хочешь формировать именно в файле lalala.php. Неужели нельзя подойти к проблеме по-другому? Покажи, плиз, реальный пример, где необходимо вызвать картинку, что-то формировать там, и потом что-то оттуда получать. А я тебе попробую подобрать решение другим путем...

Спустя 2 часа, 37 минут, 19 секунд (20.02.2008 - 22:13) Timok написал(а):
Цитата(sergeiss)
<img src=\"lalala.php\" /img>

sergeiss, ты же понимаешь, что lalala.php (даже в теге img) это вызов другого сценария, совершенно независимого от того, который формирует страницу, на который эта картинка выводится и никаких общих глобальных переменных между ними нет (не считая сессий и кук)

Я так понял тебе нужно отлавливать ошибки, возникающие при создании картинки. Тогда нужно создавать картинку во время выполнения основного сценария, при этом её сохранять в файл и в адресе указывать настоящий URL этой картинки.

Спустя 11 минут, 49 секунд (20.02.2008 - 22:25) sergeiss написал(а):
Цитата(Sylex @ 20.2.2008, 19:36) [snapback]34054[/snapback]
Цитата
Проблема как раз в том, чтобы "оттуда" получить данные. Я не знаю, на каком этапе и какая ошибка произойдет, поэтому хочу менять содержание какой-то глобальной переменной. Как только происходит ошибка, при возвращении в основной скрипт я узнаю, на каком этапе она (ошибка) произошла. Это будет понятно по содержанию глобальной переменной.


Не знаю какие действия ты хочешь формировать именно в файле lalala.php. Неужели нельзя подойти к проблеме по-другому? Покажи, плиз, реальный пример, где необходимо вызвать картинку, что-то формировать там, и потом что-то оттуда получать. А я тебе попробую подобрать решение другим путем...


Система простая. Я хочу формировать картинку, основываясь на данных из БД. Я сейчас активно прорабатываю тот вариант, что я передаю туда параметры для выбора, а уже внутри функции происходит обращение к БД и собственно формирование графика. При этом может возникнуть ряд ситуаций, когда необходимо не просто получить картинку, но и передать назад какие-то параметры. Например, если для переданного критерия нет данных, то картинку построить не получится. Естественно, я могу на картинке написать "нет данных", но надо еще и что-то передать самой программе.
Также возможны другие варианты, когда возникают ошибки. И их тоже надо обрабатывать как-то.

Можно, конечно, сначала все данные собрать, а потом передать их в другой скрипт. Но тогда их уже сложно будет через GET передать. Там есть какие-то ограничения на объем передаваемых данных. Поэтому все равно встает задача передать большой объем данных. На сей раз в направлении "туда", т.е. во "вложенный" скрипт. Если бы это решалось на уровне функций... То все было бы гораздо проще.

Да и вообще smile.gif В любом случае (для меня) будет полезно понять, как решить такую задачу. Мало ли, где пригодится.

Спустя 5 минут, 29 секунд (20.02.2008 - 22:31) sergeiss написал(а):
Цитата(Timok @ 20.2.2008, 22:13) [snapback]34067[/snapback]
Цитата(sergeiss)
<img src=\"lalala.php\" /img>

sergeiss, ты же понимаешь, что lalala.php (даже в теге img) это вызов другого сценария, совершенно независимого от того, который формирует страницу, на который эта картинка выводится и никаких общих глобальных переменных между ними нет (не считая сессий и кук)

Я так понял тебе нужно отлавливать ошибки, возникающие при создании картинки. Тогда нужно создавать картинку во время выполнения основного сценария, при этом её сохранять в файл и в адресе указывать настоящий URL этой картинки.

Да, ты правильно понял, что я хочу. Но мне все-таки хотелось бы как-то передавать данные.
Ты что-то сказал про "не считая сессий". Речь о том, что переменные типа $_SESSION[...] использовать?

Спустя 57 минут, 32 секунды (20.02.2008 - 23:28) Timok написал(а):
по полочкам:

1) пользователь запрашивает страницу - она ему посылается (text/html)
2) в коде страницы есть строка типа
Код
<img src="lalala.php" />

при этом происходит новый запрос к другому документу. Этот скрипт возвращает данные в формате image/jpeg (gif,png) - т.е. никакого текста там нет и ошибки там выводить негде. Страница, содержащая тег <img> в это время уже давно сформирована, послана и просмотрена пользователем. Т.е. туда уже тоже никак нельзя передать никакие данные.

Т.е. параметры в lalala.php ты можешь передать любым способом (GET, сессии, куки - че больше нравится). Обратно - никак. Ну почитай самые основы

Цитата(sergeiss)
Система простая. Я хочу формировать картинку, основываясь на данных из БД. Я сейчас активно прорабатываю тот вариант, что я передаю туда параметры для выбора, а уже внутри функции происходит обращение к БД и собственно формирование графика. При этом может возникнуть ряд ситуаций, когда необходимо не просто получить картинку, но и передать назад какие-то параметры. Например, если для переданного критерия нет данных, то картинку построить не получится. Естественно, я могу на картинке написать "нет данных", но надо еще и что-то передать самой программе.
Также возможны другие варианты, когда возникают ошибки. И их тоже надо обрабатывать как-то.


ещё раз - делай всё сразу. Т.е. пользователь запросил страницу, сценарий обработал, сделал все необходимые запросы к БД, сформировал картинку и сохранил её в файл (имя файла делай основываясь на данных из БД). В адресе картинок потом указывай URL-адрес сохраненного файла, а не сценария.

Можно поизвращаться - делай на странице iframe с адресом "lalala.php?параметры". Там или выводи картинку (и посылай Content-Type: image/...) или, в случае ошибки, текст сообщения об ошибке.


зы: лучше объясни в общих чертах что конкретно ты делаешь, какую логику пытаешься реализовать для чего. Т.е. что картинки, что за ошибки, вообщем опиши вкратце логику и приведи пример. Просто, по-моему, видя конкретную проблему проще будет искать решение...

Спустя 11 часов, 45 минут, 23 секунды (21.02.2008 - 11:13) sergeiss написал(а):
Цитата(Timok @ 20.2.2008, 23:28) [snapback]34073[/snapback]
зы: лучше объясни в общих чертах что конкретно ты делаешь, какую логику пытаешься реализовать для чего. Т.е. что картинки, что за ошибки, вообщем опиши вкратце логику и приведи пример. Просто, по-моему, видя конкретную проблему проще будет искать решение...

Спасибо, я сначала по твоей ссылке схожу smile.gif А там и сам до конца разберусь, наверное. Тем более, что картинки наконец-то стали строиться, я могу ими как-то управлять.
Про самые плохие ошибки я могу написать на создаваемой картинке краткую информацию. Это единственная возможность, как я понял, чтобы информировать о возникновении ошибки. Это мне уже помогло отловить пару "рукотворных глюков", или, проще говоря, моих "ляпов" (один из которых - элементарная очепятка в SQL запросе). Собственно, после их устранения "процесс пошёл".

PS. Сразу не написал, через несколько часов дописываю. Сохранять картинки и указывать их адреса я не хочу, т.к. пользователей предполагается может и немного (использование программы внутри компании для узкоспециализированных целей), но каждый будет работать достаточно активно. И картинки будут не такие уж и маленькие. В итоге мне придется как-то автоматически отслеживать, какие файлы больше не нужны и удалять их. Иначе дисковое пространство моментально забъется. Да и создание "внешних" картинок не решит проблему ошибок при работе с БД (как моих smile.gif, так и ошибок с данными).

Спустя 25 дней, 22 часа, 1 минута, 43 секунды (17.03.2008 - 09:15) LoneCat написал(а):
Вообще по-моему разумению - в код создания изображения дописываешь функцию записи ошибок в лог-файл или базу данных, и оттуда уже читаешь что у тебя не так. И к тому-же это позволит отлавливать ошибки возникающие у пользователей, вместо того чтобы доводить их до инфаркта письменями а-ля "Сустем Генерал Егор" smile.gif


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.