Да ничего там на ноль не делится. Как минимум потому что все элементы имеют значения отличные от нуля, реально отличные, соответствующие построенным кривым. Если бы был ноль, то как же на него поделилось, а потом пошло дальше считать? И сосчитало так, как будто там не ноль, а правильное значение. Фантастика. Ноль как бы есть, но его нет. Как суслик что-ли? Только наоборот.
С нулями можно потом разобраться, поскольку они на работу не влияют. А с чекбоксами-то что делать. Они не работают. Повторю. На странице: HTML: <form action="" onsubmit="return sub(this);"> <table> .... тут картинки и поля ввода данных <input type="checkbox" name="p1" value="p1">считать Р<Br> <input type="checkbox" name="e1" value="e1">считать Е ..... далее всё повторяется ещё два раза, там p2, е2 и p3, е3 <input type="submit" value="Считать" /> </table> </form> коды вывода такие: PHP: if ($_POST['p1'] = "p1") { imageSetPixel($img, 20 + $x, 600 - $Yp * $P1 * $SYp, $black); } Все линии выводятся, от чекбоксов не зависят. Если прописать как было раньше: PHP: if ($p1 == 'p1') { imageSetPixel($img, 20 + $x, 600 - $Yp * $P1 * $SYp, $black); } линий нет, от чекбоксов тоже не зависит. А раньше работало. Как правильно делать? Ну или неправильно, но чтобы пиксели набивались. Подозреваю что та библиотека данные пропускает, а чекбоксы нет. Может быть прописать руками, их всего 7 штук.
С какой радости чекбоксы проверяете в $_POST, если у вас get-ом всё передаётся? Это совершенно разные типы запросов. Нужно проверять через $_GET Потом, на равенство проверять чекбоксы - нарываться на неприятности. Я вам говорил, что неотмеченные чекбоксы браузер не включит в список параметров, $().serialize() работает также, как браузер. Поэтому их надо проверять isset или !empty, что я вам уже подсказывал. По поводу нулей - верю машине, а не вам. Подозреваю, что нули получаются не на тех данных, что вы передаёте, а на тех, что пользователь передаёт. В PHP деление ноль не является фатальной ошибкой, и исполнение программы не прерывает. Что я считаю неправильным, но меня не спрашивали --- Добавлено --- ПОтом, в php $_POST['p1']="p1" - это присвоение, а не проверка на равенство. Проверка на равенство == или === (первое приводит оба значения к одному типу, а второе проверяет и типы и значения, второй оператор потребовался, поскольку на основе синтаксиса суперстроготипизированного языка C сделали нетипизированный PHP) --- Добавлено --- Так у вас работало из-за того, что раньше сайт, видимо, обслуживала суперстарая версия php, в которой get и post параметры автоматически регистрировались в качестве глобальных переменных. А сейчас вас перекинули на сервер с более новой версией php, из которой такие вещи выпилили за небезопасность. Писал же, как надо проверять: PHP: if (isset($_GET["p1"])) // или if (!empty($_GET["p1"])) // Или использовать вместо $_GET переменную $_REQUEST
Видимо перекинули на новую версию, потому что предыдущий хостинг был с 9-го или 10-го года. Заменил на PHP: if (isset($_GET["p1"])) - всё заработало. Откуда взялось if ($p1 == 'p1') - не помню. Вроде бы из этой же темы. Блин, столько времени убил на поиск и перебор вариантов. Если нули вводят пользователи - пусть это будет их проблема. Надо вводить реальные данные - тогда никаких нулей и их последствий не будет. Заметил следующее: при обновлении страницы в файрфоксе все данные и нажатые чекбоксы остаются, а в хроме галочки в чекбоксах пропадают и введённые данные заменяются на те, что по умолчанию, а это раздражает. Есть смысл заморачиваться или и так сойдёт? Тем более что я хромом не пользуюсь.
На обновление страницы вы влиять не можете, так запрограммирован браузер. Ну можно проверить на допустимость введённых данных перед отправкой. Но 500-й ошибки всё равно пока ничего не объяснило, если будет повторяться - придётся дальше копать --- Добавлено --- Ошибки JavaScript тоже следует исправить, которые в консоли браузера. --- Добавлено --- Кстати, на ваших графиках совершенно явно видны асимптоты, в этих точках скорее всего и происходит деление на 0, если вы их отдельно не обрабатываете.
Что такое "асимптоты"? Как можно увидеть на графиках деление на 0? Допустимость введённых данных проверять нет смысла. Сама суть этого калькулятора: научить пользователя применять правильные комплектующие, а у них самые лучшие из допустимых данные.
Ха, вот, я решил блеснуть тем, что помню из курса высшей математики ВУЗа Это математический термин, а не программисткий. Асимптота - прямая, к которой график бесконечно приближается, но никогда не пересекает. И как раз в этой точке функция не имеет значения, а точнее имеет значение "бесконечность". Например, для элементарной функции y=1/x асимптотами будут прямые с уравнениями y=0 и x=0. У вас один из графиков как раз подобен графику этой функции. Вот, к примеру, жёлтым я примерно провёл асимптоты. Они на этом графике не очень ярко видны, поскольку видимо шага не хватает Я не утверждаю, что прав на 100%, эта моя гипотиза на основании данных, что эта ошибка происходит, но график всё равно строится, но до сих пор вы тут непрерывные циклы выкладывали, и если у вас попадает на асимптоту цикл, то как раз и получится там деление на ноль
В принципе я догадался, что Вы имеете в виду. Если посмотрите на выложенные ранее части расчётов, то там попадается расчёт значения Е. Там есть цифра 180. Это ровно два раза по 90º. Какое разрешение ни сделай, когда последний пиксель напечатается на границе шкалы, следующий появится с другой стороны (как питон в известной игре), между ними ничего нет. Нулей там тоже нет. А вот в такой строчке: PHP: if (isset($_GET["L11"])) $L11 = $_GET["L11"]; else $L11 = 0; ноль есть. Зачем он нужен - непонятно. Наверняка можно прописать то же действие без нуля и без четырёхкратного повторения одной и той же переменной.
Это вы написали, вам должно быть виднее, зачем это нужно. Повторение переменной здесь двукратное. Можно тернарным оператором короче записать: PHP: $L11 = isset($_GET["L11"]) ? $_GET["L11"]: 0; В PHP 7 (последняя, на данный момент, версия php) можно ещё короче (в php 5.x оператора ?? не существовало): PHP: $L11 = $_GET["L11"] ?? 0;
Написал так, как посоветовали. Вот так выглядит код с самого начала: PHP: <?php // получим координаты из GET запроса, это то, что добавляется к адресу после знака ?, например: ?x1=40&x2=100&y1=50&y2=200 if (isset($_GET["U"])) $U = $_GET["U"]; else $U = 0; if (isset($_GET["L11"])) $L11 = $_GET["L11"]; else $L11 = 0; if (isset($_GET["Rl11"])) $Rl11 = $_GET["Rl11"]; else $Rl11 = 0; if (isset($_GET["C11"])) $C11 = $_GET["C11"]; else $C11 = 0; if (isset($_GET["Rd1"])) $Rd1 = $_GET["Rd1"]; else $Rd1 = 0; ... и т.д. Так понимаю эти строчки дают понять последующим вычислениям что есть следующие переменные. Если можно обойтись или упростить - было бы замечательно. Как узнать какая версия php поддерживается?
Напишите и запустите через браузер скрипт такого содержания: PHP: <?php phpinfo(); Сократить можно, как я написал выше - через тернарный оператор. Но вообще, вы понимаете, что здесь происходит? Строчка 12 переводится на русский язык: Код (Text): Если в запросе get передан параметр L11, то присвоить его значение переменной $L11, иначе записать в переменную $L11 0 Аналогично переводятся и все остальные подобные строки, а так же их аналоги с тернарным оператором и оператором ??, которые привёл я.
Примерный смысл понятен. А можно написать без иначе? Откуда там другое значение возьмётся если по умолчанию всё написано. Если пользователь поменяет значение по умолчанию на своё, то всё равно будет не ноль, а если он вдруг ноль напишет, то тогда опять же будет не то, что эти строки назначают, а то, что пользователь ввёл. Добавка про "иначе" лишняя в любом случае. Вечно этот рнр (Version 5.3.18) пытается подсунуть то, о чём его не просят. Потом делит на то, что подсунул и возмущается что его заставляют на ноль делить. Может так написать? PHP: $L11 = isset($_GET["L11"]) ? $_GET["L11"]: L11; Опять в одной строке надо 4 раза переменную повторить. Видимо где-то в центре обитания php сидят два прапорщика и если каждому по два раза не повторишь - ничего дальше по команде не передают. А нельзя после знака вопроса сразу поставить точку с запятой и перейти к следующей строчке?
Никто вам ничего не подсовывает. Он делает ровно то, что вы пишите. Иначе можно и не писать. Можно написать другое значение. Можно написать другую реакцию. Это ваш алгоритм заставляет делить на ноль, php честно выполняет то, что ему написали. Вы просто не хотите попытаться выяснить, откуда этот 0 берётся, а я могу только гипотезы строить, что не интересно. Ну не хотите - сидите с делением на 0 в логах... --- Добавлено --- И не надо всё писать в тоне претензии, как будто вы у меня программу заказали, а я вам всё неправильно сделал
Ни в коем случае это не претензия. Вы всё пишите правильно, Ваши рекомендации работают, это я их неправильно применяю. Просто я долго пытаюсь найти а алгоритме нули и не могу. А других нулей, кроме как в этих строках нет. Если исправлю как Вы предложили, то нули останутся - проблема не решится. Этот алгоритм ещё на программируемых калькуляторах зародился, потом прошёл через самые первые компьютеры (при помощи бейсика) и никогда ничего на ноль не делилось. Потому что нигде не было выражений, где было бы написано, что в каком-то случае переменной будет присвоено значение 0. Они появились только теперь. Так можно написать? PHP: $L11 = isset($_GET["L11"]) ? ;
Ну значит надо смотреть подробнее, при каких данных это всё-таки возникает. Заочно тяжело. Ясно, что дело не в php, а в программе (дело редко бывает в том, что машина ошиблась, обычно ошибается программист), поэтому надо анализировать всю программу. Пока не ясно. Кстати, 500-я ошибка не повторялась?
Нет. Как я понял сайт переместили на другой сервер, все настройки поменялись, даже цифры вокруг поля графика жирные стали. Версия php скорее всего сменилась, html без видимых изменений. Сегодня целый день ковырялся - всё работает. Наличие нулей заявлено только в логах. Наверно не буду больше искать. В алгоритме расчёта на ноль ничего не делится, иначе бы он просто не работал бы, потому что конечный результат выводится в виде координат, и они явно не 0, а промежуточные все используются дальше, как может использоваться при расчётах результат деления на 0 - не могу себе представить. Особенно учитывая, что итог расчёта вполне соответствует ожиданиям. Поэтому нули не в алгоритме расчёта, а в рнр-шной обвязке, например в строках присвоения, где в конце зачем-то 0.
Странный всё-таки этот php. Файл в который записываются ошибки php стал 230МВ размером, в результате хостинг достиг ограничения по объёму и теперь ничего нельзя не заменить, не исправить. Подозреваю что кому-то очень не нравится способ расчётов. Посмотрел ещё раз посты 52 и 53. Ну вот как один способ заменять на другой. А если ошибка попадётся, то как её искать в алгоритме поста 53? Там же над одной строчкой надо 5 минут думать что в ней зашифровано. В алгоритме 52 - всё чётко и понятно.
Ну вот поэтому и надо было выяснить, в чём дело, откуда там ошибки. Скачайте файл логов и попросите очистить. Дело точно не в применении eval, поскольку если бы функция была запрещена хостингом, то ничего бы вообще не работало. Надо подробно изучить логи ошибок, и выяснить, в чём дело
Подробно изучить? Изучил. Если исключить деление на 0, то можно будет сильно сократить кол-во ошибок. А нули только в начальных строках, где он зачем-то присутствует.
На те переменные ничего не делится. И вы показываете старый лог. В целом, можно логировать состояние системы именно в момент, когда делится на ноль, и смотреть, что к этому привело. Вот только сейчас пришла идея сделать это так (единственное, для вас много новых команд будет, а читать вы ничего не хотите): PHP: set_error_handler(function ($errno , $errstr, $errfile, $errline, $errcontext) { if ($errstr == "Division by zero") { $f = fopen(__DIR__ . "/log/err.txt", "a"); fputs($f, "Произошло деление на ноль " . data("d.m.Y H:i:s") . "в строке $errline файла $errfile \n"); fputs($f, var_export($errcontext, 1) . PHP_EOL); fclose($f); } }); Если добавить это в начало файла, и создать на сайте каталог log с правами 777, после чего в случае деления на 0 можно будет получить полную картину данных, приведших к этому, а не гадать на кофейной гуще, какой нолик привёл. Опять же, повторюсь, не видя формул, я не могу сказать область определения ваших функций. И может возможен пользовательский ввод, который приводит к делению на 0, если он возможен, его надо отдельно обработать, и выдавать пользователю сообщение а-ля "Чувак, ты идиот". --- Добавлено --- То, что я написал - это то, чтобы я сделал, если бы у меня не получалось самому найти данные, приводящие к ошибке --- Добавлено --- Вы же понимаете, кстати, что чтоб произошла ошибка деления на 0, он должен оказаться именно в знаменателе, а не просто в любой переменной?
Кто тут гениальный программист? mkramer!!! Почему? Он нашёл причину деления на 0, даже не видя полного текста скрипта!!! Короче, у вас в тексте, до того, как пользователь заполнил форму, если такая любопытная строчка Т.е. ваш скрипт, который должен выполнять все расчёты, в ней вызывается вообще без параметров. А поскольку вы не позаботились об обработке такого случая (судя по тем фрагментам кода, которые вы сюда кидали), а точнее, откуда-то накопировали подстановку туда нулей, при каждой загрузки страницы происходит целая череда делений на 0, поскольку скрипт пытается всё обсчитать график, не имея данных --- Добавлено --- Просто обработайте случай, когда данные не переданы, особо. Например, нарисуйте в этом случае только оси, и будет вам счастье. Чтобы проверить, переданы ли данные, надо проверить, есть ли нужный элемент в суперглобальном массиве $_GET
Блин. А как надо? Видимо Вы действительно гениальный программист. А я только копировать чужие куски кода умею. Вот что накопировал: PHP: <h1 align="center" class="style3">РАСЧЁТ ФИЛЬТРА</h1> <div class="story"> <form action="" onsubmit="return sub(this);"> <table><tr><td> <table bgcolor="#d5d5d5" border="2" cellpadding="1" class="style6"> <tr><td colspan="3"> Редкоизменяемые данные: U = <input name="U" type="text" value="8" size="4"/></td></tr> <tr align="center"> <td valign="top"><table> <tr><td align="center" colspan="4"><img src="Picture/II_order_L.jpg" width="160" height="90" /></td></tr> <tr><td width="26" align="right">L = </td><td width="40"><input name="L11" type="text" value="8" size="4"/></td> <td width="32" align="right">Rl = </td><td width="40"><input name="Rl11" type="text" value="0.4" size="4"/></td></tr> <tr><td align="right">C = </td><td><input name="C11" type="text" value="80" size="4"/></td> <td align="right"></td><td></td></tr> <tr><td align="right">Re = </td><td><input name="Rd1" type="text" value="7" size="4"/></td> <td align="right">Le = </td><td><input name="Ld1" type="text" value="0.1" size="4"/></td></tr> <tr><td colspan="4"><input type="checkbox" name="p1" value="p1">считать Р1<Br> <input type="checkbox" name="e1" value="e1">считать Е1</td></tr></table></td> <td valign="top"><table> <tr><td align="center" colspan="4"><img src="Picture/II_order_HL.jpg" width="160" height="90" /></td> <tr><td width="40" align="right">R1 = </td><td width="40"><input name="R31" type="text" value="0.5" size="4"/></td> <td width="42" align="right">C1 = </td><td width="40"><input name="C31" type="text" value="80" size="4"/></td></tr> <tr><td align="right">L1 = </td><td><input name="L31" type="text" value="8" size="4"/></td> <td align="right">Rl1 = </td><td><input name="Rl31" type="text" value="0.5" size="4"/></td></tr> <tr><td align="right">L2 = </td><td><input name="L32" type="text" value="0.4" size="4"/></td> <td align="right">Rl2 = </td><td><input name="Rl32" type="text" value="0.25" size="4"/></td></tr> <tr><td align="right">C2 = </td><td><input name="C32" type="text" value="3.9" size="4"/></td> <td align="right">Rd = </td><td><input name="Rd3" type="text" value="7" size="4"/></td></tr> <tr><td colspan="2"><input type="checkbox" name="p3" value="p3">считать Р3</td> <td colspan="2"><input type="checkbox" name="e3" value="e3">считать Е3</td></tr></table></td> <td valign="top"><table> <tr><td align="center" colspan="4"><img src="Picture/II_order_H.jpg" width="160" height="90" /></td></tr> <tr><td width="30" align="right">R = </td><td width="40"><input name="R21" type="text" value="0.4" size="4"/></td> <td width="30" align="right">C = </td><td width="40"><input name="C21" type="text" value="3.85" size="4"/></td></tr> <tr><td align="right">L = </td><td><input name="L21" type="text" value="0.38" size="4"/></td> <td align="right">Rl = </td><td><input name="Rl21" type="text" value="0.25" size="4"/></td></tr> <tr><td align="right">Rd = </td><td><input name="Rd2" type="text" value="7" size="4"/></td></tr> <tr><td colspan="4"><input type="checkbox" name="p2" value="p2">считать Р2<Br> <input type="checkbox" name="e2" value="e2">считать Е2</td></tr></table></td> <tr valign="top"><td colspan="3"> <input type="checkbox" name="p12" value="p12">считать общую Р1 и Р2 <input type="checkbox" name="p13" value="p13">считать общую Р1 и Р3 <input type="checkbox" name="p32" value="p32">считать общую Р3 и Р2</td></tr> <tr valign="top"><td colspan="3"> <input type="checkbox" name="p132" value="p132">считать общую Р1, Р2 и Р3</td></tr></table></td> <td> </td><td valign="top"> <p> Графический калькулятор находится в стадии отладки. Пользоваться можно с целью ознакомления. </p></td></tr> <tr><td colspan="4"><br /><input type="submit" value="Считать" /></td></tr> </table> </td></tr> </table> </form> <br /> <table> <td width=720> <!-- выведим наш рисунок в браузер, указав желаемые размеры!--> <img id="myimg" border="0" style="width:718px; height:620px;" src="script.php" alt="" /> <script type="text/javascript"> // Функция вызываемая при отправке формы, что бы форма не отправлялась функция должна вернуть false function sub (f) { // получим значения полей ввода из формы var U = f.U.value; var L11 = f.L11.value; var Rl11 = f.Rl11.value; var C11 = f.C11.value; var Rd1 = f.Rd1.value; var R31 = f.R31.value; var C31 = f.C31.value; var L31 = f.L31.value; var Rl31 = f.Rl31.value; var L32 = f.L32.value; var Rl32 = f.Rl32.value; var C32 = f.C32.value; var Rd3 = f.Rd3.value; var R21 = f.R21.value; var C21 = f.C21.value; var L21 = f.L21.value; var Rl21 = f.Rl21.value; var Rd2 = f.Rd2.value; // здесь нужно проверять вводные на правильность, т.е. что бы были цифрами и не были пустыми if ( U == "" || L11 == "" || Rl11 == "" || C11 == "" || Rd1 == "" || R31 == "" || C31 == "" || L31 == "" || Rl31 == "" || L32 == "" || Rl32 == "" || C32 == "" || Rd3 == "" || R21 == "" || C21 == "" || L21 == "" || Rl21 == ""|| Rd2 == "" ) { alert ("Заполните все поля ввода !"); return false; } //формируем GET запрос var get = "?" + $(f).serialize() var get = "?" + $(f).serialize() // меняем src нашего рисунка тем самым делая новый запрос к скрипту script.php document.getElementById("myimg").src = "script.php"+get; // что бы форма не отправлялась и не перезагружала страницу возвращаем false return false; } </script> </td></tr> </table> Там сначала присваиваются данные по умолчанию и они ни разу ни ноль. Строчка, которую Вы нашли после. Как её изменить, чтобы избежать деления на ноль? Прикрепил конец логов. Там примерно с середины только такие ошибки остались, других нет.
Либо уберите script.php из тега img до отправки данных, либо сделайте в нём инструкции типа PHP: // как минимум if (empty($_GET)) { // нарисовать к примеру, только оси } // как максимум if (!isset($_GET["U1"], $_GET["L11"] /* и так далее, все остальные необходимые для расчётов через запятую*/)) { // нарисовать только оси } Т.е. если скрипт может быть вызван без параметров (а это у вас происходит), он должен корректно отрабатывать без параметров. Ну или уберите его из тега img, когда он без параметров. src может быть и пустым, с точно тем же эффектом, что и сейчас --- Добавлено --- Либо сразу подставьте в img вызов скрипта с дефолтными данными после вопроса. Либо замените 0 в том коде, что есть, на дефолтные данные (данные по умолчанию), тогда сразу будет строиться дефолтный график. Вариантов много --- Добавлено --- Вот сюда вставьте дефолт вместо 0.
Данные и так дефолтные в окнах появляются сразу. Чтобы график нарисовался достаточно нажать кнопку. Он и рисуется по этим данным. Вводить ничего не надо. И тут появляется строка с нулём в конце. Вообще непонятно зачем там нужна какая-то цифра. Неужели нельзя обойтись без else? Там же уже стоит точка с запятой. Разве так нельзя: PHP: if (isset($_GET["U"])) $U = $_GET["U"]; Или так: PHP: $L11 = isset($_GET["L11"]) ?; Нет нуля - нет деления на ноль. Можно конечно написать что-то типа 0.0001, но это будут костыли, в данном случае применяемые для исправления косяков кода. Не того, который программист написал, а того, который придумали авторы php. И даже в седьмой версии тоже в конце ноль. PHP: $L11 = $_GET["L11"] ?? 0; Ну ёлки-палки. Видимо и в следующих версиях php придётся обычному начинающему любителю поковырять код придумывать костыли, чтобы на этот ноль делиться не начало.