Пытаюсь сделать графическое отображение информации на сайте. Переменным присвоены значения, теперь их необходимо отобразить в виде двух прямоугольников: один под другим. Длина прямоугольника равна значению переменной, в пикселях. Код написал, но что-то он не работает... Переменные ТОЧНО имеют некоторые значения, их я выводил отдельной командой. Подскажите, пожалуйста, что можно изменить в тексте кода или предложите другое решение для этой задачи? Здесь уже начиналось обсуждение этого вопроса: http://php.ru/forum/viewtopic.php?f=2&t=44420&p=355470#p355470 Код (Text): <?php include ("bd.php"); $querynechet=mysql_query("SELECT SUM(nechet) FROM users3",$db); $sumnechet=mysql_result($querynechet,0); $querychet=mysql_query("SELECT SUM(chet) FROM users3",$db); $sumchet=mysql_result($querychet,0); $all=$sumnechet+$sumchet; $chpr=round(($sumchet/$all)*100); $nchpr=round(($sumnechet/$all)*100); header ("Content-type: image/png"); $col1 = imagecolorallocate ($imch, 255, 0, 0); $col2 = imagecolorallocate ($imnch, 50, 0, 0); imagefilledrectangle ($imch, 0, 0, $chpr, 20, $col1); imagefilledrectangle ($imnch, 0, 30, $nchpr, 20, $col2); imagepng ($imch); imagepng ($imnch); ?>
ну в соседней ветке мы уже выяснили что вы зря пытаетесь дважды вызвать вывод двух разных картинок в одном ответе. вам нужно склеить два холста. но об этом чуть позже... imagecolorallocate как и большинство функций библиотеки гд принимает ссылку на холст, созданный одной из соответствующих функций. вы же вызываете сразу. если сделать уровень журналирования выше то вы увидете при двух вызовах этих функций два сообщения о том что обе переменные не инициализованы (не объявлены ранее) в соседней теме вы прикладываете код, который у вас работает. обратите внимание что вы там создаете ресурс перед использованием: $im = ImageCreate (200, 100); $col = ImageColorAllocate ($im, 255, 50, 100); то есть весь фикс вашей проблемы сводится к созданию холста перед тем как с ним работать. но тут у вас всплывет другой косяк - два изображения в один поток. это надо холст чуть больше создать и грамотно расположить на нем ваши изображения и потом уже один раз его показать. изучайте мануал по библиотеке гд. будут вопросы - пишите. не забывайте выкладывать проблемный код, объяснять что вы от него ожидаете и что видите на самом деле.
Не удаётся написать код даже для создания статических прямоугольников. Как он будет выглядеть? Я вот что написал: Код (Text): <?php header ("Content-type: image/png"); $im = imagecreate (110, 60); //создал холст $color = imagecolorallocate ($im, 0, 0, 0); //указал цвет фона холста $imch = imagefilledrectangle ($im, 5, 5, 80, 20, $col1); //создал прямоугольник $col1 = imagecolorallocate ($imch, 255, 0, 0); // указал для этого прямоугольника цвет $imnch = imagefilledrectangle ($im, 5, 30, 20, 55, $col2); // теперь создал ещё один прямоугольник $col2 = imagecolorallocate ($imnch, 255, 0, 0); //ему тоже назначил цвет imagepng ($im); // ну и вывел холст с содержимым на экран ?> Код не работает ((( Добавлено спустя 46 минут 12 секунд: Код (Text): $im = imagecreate (110, 60); //создал холст $color = imagecolorallocate ($im, 10, 200, 0); //указал цвет фона холста $col = imagecolorallocate ($im, 255, 0, 0); // указал для прямоугольников цвет imagefilledrectangle ($im, 5, 5, $chpr, 25, $col); //создал прямоугольник imagefilledrectangle ($im, 5, 30, $nchpr, 50, $col); // создал ещё один прямоугольник imagepng ($im); // вывел холст с содержимым на экран Вуаля, работает! ))) Однако, вставить сюда данные из базы данных не получается пока что (((
не работает у вас кое-что другое. я вам весь вечер рассказываю про журнальчик а вы так и не уподобились его врубить. пожалуйста, я выкладываю то что у вас в журнале по исполнению данного кода: Код (Text): PHP Notice: Undefined variable: col1 in .php on line 6 PHP Warning: imagecolorallocate() expects parameter 1 to be resource, boolean given in .php on line 7 PHP Notice: Undefined variable: col2 in .php on line 8 PHP Warning: imagecolorallocate() expects parameter 1 to be resource, boolean given in .php on line 9 я даже не удивлен что при этом логика скрипта нарушена... давайте кстати на нее и посмотрим. построчно: Код (PHP): <?php header ("Content-type: image/png"); // уведомили браузер что поток битов будет картинкой типа пиэнджи. ОК $im = imagecreate (110, 60); //создал холст // создал холст. ОК imagecolorallocate ($im, 0, 0, 0); //указал цвет фона холста // первый вызов данной функции после создания холста задает цвет холста. ОК // внимание! я убрал присвоение значения ибо оно лишнее #$imch = imagefilledrectangle ($im, 5, 5, 80, 20, $col1); //создал прямоугольник // не создал потому что цвет передан необъявленной переменной #$col1 = imagecolorallocate ($imch, 255, 0, 0); // указал для этого прямоугольника цвет // не указал так как переменная $imch не содержит холста и вообще не определена #$imnch = imagefilledrectangle ($im, 5, 30, 20, 55, $col2); // теперь создал ещё один прямоугольник // не создал потому что цвет передан необъявленной переменной #$col2 = imagecolorallocate ($imnch, 255, 0, 0); //ему тоже назначил цвет // не указал так как переменная $imnch не содержит холста и вообще не определена // ВНИМАНИЕ, РЕШЕНИЕ: $col = imagecolorallocate ($im, 255, 0, 0); // создали цвет для первого пу. тут внимание - переменная без единички на конце imagefilledrectangle ($im, 5, 5, 80, 20, $col); // создали пу с этим цветом $col = imagecolorallocate ($im, 0, 255, 0); //создали цвет для второго пу. для наглядности - зеленый. внимание2 - я переопределил значение переменной без единички на конце imagefilledrectangle ($im, 5, 30, 20, 55, $col); // создали пу с этим цветом imagepng ($im); // ну и вывел холст с содержимым на экран // дивимся двумя красными (правда один зеленый) прямоугольниками на черном фоне, ОК ?> похоже вы не достаточно усердно штудируете мануал...
Да всё работает, я переписал код уже (если посмотреть моё предыдущее сообщение, то в этом можно убедиться!!!). Вопрос в другом: как теперь снабдить алгоритм построения прямоугольников переменными? Код (Text): <?php include ("bd.php"); $querynechet=mysql_query("SELECT SUM(nechet) FROM users3",$db); $sumnechet=mysql_result($querynechet,0); $querychet=mysql_query("SELECT SUM(chet) FROM users3",$db); $sumchet=mysql_result($querychet,0); $all=$sumnechet+$sumchet; $chpr=round(($sumchet/$all)*100); //эта переменная будет определять длину первого ПУ $nchpr=round(($sumnechet/$all)*100); //эта переменная будет определять длину второго ПУ header ("Content-type: image/png"); $im = imagecreate (110, 60); //создал холст $color = imagecolorallocate ($im, 10, 200, 0); //указал цвет фона холста $col = imagecolorallocate ($im, 255, 0, 0); // указал для прямоугольника цвет imagefilledrectangle ($im, 5, 5, $chpr, 25, $col); //создал прямоугольник длиной $chpr imagefilledrectangle ($im, 5, 30, $nchpr, 50, $col); // теперь создал ещё один прямоугольник длиной $nchpr imagepng ($im); //вывел холст с содержимым на экран ?>
А сложность, по всей видимости, в этой вот строчке: Код (Text): header ("Content-type: image/png"); определяет какие данные нужно отображать, но для назначения переменных нужно использовать "text/html", наверное. Как же этот винегрет объединить в одном скрипте? Может я чего-то недопонимаю, но пятой точкой чую, что дело именно в этом. По-отдельности части скрипта с определением переменных и с построением картинок работают, а вместе не хотят. Сейчас скрипт с построением картинки я запускаю отдельно, а если я его, вставлю на страничку с остальным контентом, где все данные передаются как "Content-type: text/html", то он не будет работать? Или из-за строки "Content-type: image/png" произойдёт конфликт и не верно будет отображаться всё содержимое страницы? Что-то вообще запутался. Добавлено спустя 7 минут 5 секунд: Да, так и есть: инклюдил этот скрипт в тело странички, выдало: "Warning: Cannot modify header information". Конфликт "text/html" и "image/png" налицо. Как-то же люди справляются с этим?
сервер отвечает браузеру набором бит. чтоб браузер понял как их отобразить - присылается заголовок с типом содержимого. к назначению переменных это вообще не относится. вы действительно не понимаете что вы делаете и пятая ваша точка очень глубоко ошибается. зачем вы принимаетесь за сложные задачи если вы как программист еще вообще не понимаете ничего? вы не знаете что с чем состыковать потому что пропустили это. вы не можете отладить потому что пропустили и это. докажите мне свое утверждение про по отдельности и вместе
Что тут доказывать? Пишу одну часть кода - получаю положительный результат (через echo вывожу значения переменных) , пишу другую - получаю положительный результат (прорисовывается картинка). Вместе (код я уже писал) - не работает. Повторюсь, что не претендую на звание сумер-пупер-мега программиста, я ничерта в этом не смыслю, просто есть задача, нужно найти для неё решение... ВСЁ. Что касается заголовков с типом содержимого, пишу ещё раз: "инклюдил этот скрипт в тело странички сайта, выдало: "Warning: Cannot modify header information". Потому что в начале страницы есть строка "Content-type: text/html", а в этом скрипте, который инклюдится, есть строка "Content-type: image/png". Как с этим справится? Ganzal, я нисколько не сомневаюсь, что Вы - отличный программист, и знаю, что я - ноль в php. Я наслушался уже полно критики по поводу того, что я плохой программист, но это совсем не меняет сути поставленной задачи и уж тем более не решит её. Ресурсы, подобные этому сайту, призваны помогать в решении проблем, но всегда находятся гуру, которые слетаются и начинают говорить, что ты ничерта не смыслишь в этом. Я это знаю, у меня совсем другая профессия и образование, очень далёкие от программирования!!! Я просто прошу помощи и жду именно помощи, а не чего-то другого. Если в состоянии помочь - помогите, я буду благодарен, нет - не нужно тогда вообще ничего писать, смысла в этом никакого, разве что только потешить своё эго...
Если я правильно понял Вашу проблему и Вам нужно показать и картинку и текст на одной странице, то я бы на вашем месте сделал так: создал 2 php-файла. Один для текста, другой для картинки. И в том, что текстовый выводил бы картинку вот в таком виде Код (Text): echo 'мой текст, много текста'; echo '<img src="ПУТЬ К ФАЙЛУ ЧТО ГЕНЕРИРУЕТ КАРТИНКУ.php">'; echo 'еще текст, нужно больше золота';
я подумал, что для новичка будет понятнее, что происходит именно вывод. А так можно было бы еще про шаблоны рассказать и про разделение логики и представления =) Хотя, наверно, Вы правы, что нужно сразу учиться писать чистый код: Код (Text): //код, код, php код ?> мой текст, много текста <img src="ПУТЬ К ФАЙЛУ ЧТО ГЕНЕРИРУЕТ КАРТИНКУ.php"> еще текст, нужно больше золота <?php //дальше код, php кот
Спасибо, то что нужно! Вот только вставить переменные не удаётся. Не пойму в чём проблема ((( Так работает: Код (Text): $chpr=50; $nchpr=70; header ("Content-type: image/png"); $im = imagecreate (110, 60); $color = imagecolorallocate ($im, 10, 200, 0); $col = imagecolorallocate ($im, 255, 0, 0); imagefilledrectangle ($im, 5, 5, $chpr, 25, $col); imagefilledrectangle ($im, 5, 30, $nchpr, 50, $col); imagepng ($im); И так работает: Код (Text): $sumnechet=5000; $sumchet=300; $all=$sumnechet+$sumchet; $chpr=round(($sumchet/$all)*100); $nchpr=round(($sumnechet/$all)*100); header ("Content-type: image/png"); $im = imagecreate (110, 60); $color = imagecolorallocate ($im, 10, 200, 0); $col = imagecolorallocate ($im, 255, 0, 0); imagefilledrectangle ($im, 5, 5, $chpr, 25, $col); imagefilledrectangle ($im, 5, 30, $nchpr, 50, $col); imagepng ($im); Проверяю работоспособность выборки данных из базы данных+формирование переменных, всё получается (вывожу результат через echo): Код (Text): include ("bd.php"); $querynechet=mysql_query("SELECT SUM(nechet) FROM users3",$db); $sumnechet=mysql_result($querynechet,0); $querychet=mysql_query("SELECT SUM(chet) FROM users3",$db); $sumchet=mysql_result($querychet,0); $all=$sumnechet+$sumchet; $chpr=round(($sumchet/$all)*100); $nchpr=round(($sumnechet/$all)*100); echo $nchpr; echo $chpr; Едем дальше. А дальше ничего не работает: Код (Text): include ("bd.php"); $querynechet=mysql_query("SELECT SUM(nechet) FROM users3",$db); $sumnechet=mysql_result($querynechet,0); $querychet=mysql_query("SELECT SUM(chet) FROM users3",$db); $sumchet=mysql_result($querychet,0); $all=$sumnechet+$sumchet; $chpr=round(($sumchet/$all)*100); $nchpr=round(($sumnechet/$all)*100); header ("Content-type: image/png"); $im = imagecreate (110, 60); //создал холст $color = imagecolorallocate ($im, 10, 200, 0); $col = imagecolorallocate ($im, 255, 0, 0); imagefilledrectangle ($im, 5, 5, $chpr, 25, $col); imagefilledrectangle ($im, 5, 30, $nchpr, 50, $col); imagepng ($im); Блин, в чём же дело?
ну наконец-то движемся в нужном направлении. листинги вижу. а результаты выполнения этих листингов почему до сих пор скрываются? только пожалуйста echo замените на var_dump чтоб больше подробностей было видно.
Вот оно с "Вардампом" Код (Text): include ("bd.php"); $querynechet=mysql_query("SELECT SUM(nechet) FROM users3",$db); $sumnechet=mysql_result($querynechet,0); $querychet=mysql_query("SELECT SUM(chet) FROM users3",$db); $sumchet=mysql_result($querychet,0); $all=$sumnechet+$sumchet; $chpr=round(($sumchet/$all)*100)+5; $nchpr=round(($sumnechet/$all)*100)+5; var_dump ($nchpr); var_dump ($chpr); результат: "float(77) float(33)"
тааак.... запрос к БД и калькуляцию удаляю, жестко определяю переменные и шаманю с изображением: Код (PHP): $nchpr = (float) 77; $chpr = (float) 33; header ("Content-type: image/png"); $im = imagecreate (110, 60); imagecolorallocate ($im, 10, 200, 0); $col = imagecolorallocate ($im, 255, 0, 0); imagefilledrectangle ($im, 5, 5, $chpr, 25, $col); imagefilledrectangle ($im, 5, 30, $nchpr, 50, $col); imagepng ( $im ); вижу на зеленом фоне два красных пу, один под другим, второй больше первого. сценарий не записывает ничего в журнал значит все корректно.
Ну это да, само собой, работает. Я уже писал подобный код, всё ок. Вопрос о рисовании решили. Но с БД и калькуляцией работать не хочет, хотя переменным корректно присваивается значение.
1. вместо Content-type: image/png забейте text/plain 2. сразу после этого заголовка вставьте строку: var_dump( headers_list() ); exit; 3. обратитесь к этому скрипту напрямую (а не через страницу на которой он вызывается как картинка) результат вардампа сюда
Вот такой результат выдало: Код (Text): array(2) { [0]=> string(24) "X-Powered-By: PHP/5.3.24" [1]=> string(24) "Content-type: text/plain" }
перед первой строкой (иклюд бд): error_reporting(E_ALL); ini_set("display_errors", 1); ini_set("display_startup_errors", 1); и опять прямой запрос.
То же самое: Код (Text): array(2) { [0]=> string(24) "X-Powered-By: PHP/5.3.24" [1]=> string(24) "Content-type: text/plain" }