код вычисления факториала: Код (Text): <form action="" method="POST"> <input type="text" name="text" > <input type="submit" name="click" value="Рассчитать факториал"> </form> <?php $number = $_POST['text']; function factorial($number) { if ($number == 0 or $number ==1) return 1; $result = $number*factorial($number-1); return $result; } if (isset($number)) echo factorial($number); интересует следующий момент: при первом(!) заходе на страницу с кодом, результат выглядит так (как и должен выглядеть): предположим, что я захотел вычислить факториал числа 4 : всё хорошо - считает, но делаю обновление страницы и число 24 остается, в чём трабл? в моём представлении должно стать так, как было до вычислений, т.е. пустой инпут и кнопка отправки.
при обновлении страницы браузер спрашивать а не сделать ли мне удалому молодцу пост-запрос с теми же данными формы. и ты соглашаешься. и он делает. и ты вновь видишь 24.
После принятия пост-запроса, нужно отдавать заголовок с переадресацией. Пусть даже на эту же самую страничку.
куда ещё можно вставить заголовок не знаю, однако получаю варнинг разжует кто-нибудь? з.ы. перевод ошибки я и сам прекрасно понимаю, мне решение и причину подсказать нужно бы)
В саааамом начале кода поставь ob_start(), будет тебе счастье. И потом почитай, что такое буфер вывода, как он работает и какие фичи умеет. Причина ошибки в том, что заголовки не могут идти в ответе сервера после контента. Только до. Те, кто не знают о буфере вывода, начинают дико костылить на этом моменте и выдумывать кривоколесные велосипеды. А те, кто знают, просто используют буфер. Он собирает все выхлопы скрипта, после чего отдает наружу залпом, но, при этом, сначала отдает все заголовки, когда бы они ни были выставлены. Потом уже остальной контент. И вуаля - что бы ты ни делал, всегда будешь иметь корректный ответ сервера. Добавлено спустя 3 минуты 22 секунды: p.s. НИКОГДА не выкладывай код в виде скриншота. Копипасть. Добавлено спустя 1 минуту 26 секунд: И да, в твоем случае, лучше просто передавать GET-ом число. Потому что ты сейчас именно в той ситуации, когда вместо GET-а используется POST.
так точно, почитаю и приму к сведению. но проблема теперь такая: код выглядит сл. образом: Код (Text): <?php ob_start(); ?> <form action="" method="POST"> <input type="text" name="text" > <input type="submit" name="click" value="Рассчитать факториал"> </form> <?php $number = $_POST['text']; header("location: index.php"); function factorial($number) { if ($number == 0 or $number ==1) return 1; $result = $number*factorial($number-1); return $result; } if (isset($number)) echo factorial($number); ?>
Потому что ты, при заходе на страницу, сразу же отдаешь заголовок переадресации) Добавлено спустя 2 минуты 21 секунду: Вообще тебе тут, повторюсь, нужен обычный GET. Без заголовков и тд. Ситуация не для POST.
так-с, я проснулся - можно начинать думать. у меня происходит редирект(так, кажется, это называется?), но не так, как мне нужно. я отправляю через форму число, скрипт обрабатывает это число и перенаправляет меня на эту же страницу, так, что я не вижу того, что он вывел там, т.е. результата вычислений визуально нет. Код (Text): <?php ob_start(); ?> <form action="" method="POST"> <input type="text" name="text" > <input type="submit" name="click" value="Рассчитать факториал"> </form> <?php $number = $_POST['text']; function factorial($number) { if ($number >= 0) { if ($number == 0 or $number ==1) return 1; $result = $number*factorial($number-1); return $result; } else echo "error"; } if (isset($number)) { echo factorial($number); header("Location: index.php"); } такой способ мне не совсем подходит. мне нужно, чтобы он вывел результат, а при обновлении страницы (alt+f5, for example) введенные мною данные были сброшены, т.е. я пришел к исходному виду. Добавлено спустя 4 минуты 58 секунд: а если не использовать буфер (и, соответственно, заголовок), то при нажатии alt+f5 происходит следующее но вне зависимости от моего ответа (да или нет) - результат скрипта вычислений "не сбрасывается". з.ы. если что не понятно объяснил - пишите)
iNEEdhLw, поставьте в форму method='get', и не парьтесь (естественно, введённое значение надо будет забирать из $_GET). Сурикат небось тут уже устал повторять. post запросы принято использовать для таких задач, как добавление чего-то в базу данных, или когда желательно, чтоб данные не фигурировали в урле (как при авторизации, к примеру)
забыл об этом написать, я так уже делал, но тогда окошко с вопрос не выскакивает, а обновление страницы будто и вовсе не происходит - рез-ат вычислений не пропадает. Код (Text): <?php // ob_start(); ?> <form action="" method="GET"> <input type="text" name="text" > <input type="submit" name="click" value="Рассчитать факториал"> </form> <?php $number = $_GET['text']; function factorial($number) { if ($number >= 0) { if ($number == 0 or $number ==1) return 1; $result = $number*factorial($number-1); return $result; } else echo "error"; } if (isset($number)) { // header("location: index.php"); echo factorial($number); }
у протокола передачи гипертекста и пхп на стороне сервера есть две возможности. возможность первая: гет-запрос. но тебе не нравится что у тебя данные в урл попадают возможность вторая: пост-запрос. но тебе не нравится что обновление страницы приводит к повторной отправке того же значения и как следствие повторному вычислению и тому же результату. а ты хочешь на обновление страницы чтоб всё пусто было. ну не знаю, можно через сессии сделать костыль. открылась форма - записали в сессию рандом и спрятали этот рандом в сессию и в скрытое поле в форме. отправленную форму проверяем на актуальность этого рандома. если он актуален - считаем факториал. не актуален - пропускаем подсчет. и не забываем обновление рандома в правильных местах кода. ну и естественно джаваскрипт тоже не стоит со счетов сбрасывать. открыли страницу, ввели число, нажали кнопку, посчитали, записали результат. и другой адрес не придется открывать. и если обновить - всё очищается и без назойливых предупреждений.
Ganzal, можно и проще. Результаты вычисления писать в сессию, переадресовывать на ту же страницу, считывать... Но зачем такие сложности ради вычисления факториала. Код (PHP): <?php function factorial($number) { if ($number == 0 or $number ==1) return 1; $result = $number*factorial($number-1); return $result; } session_start(); if ($_SERVER["REQUEST_METHOD"] == "POST") { $number = $_POST['text']; $_SESSION["factorial"] = factorial($number); header("Location: " . $_SERVER["REQUEST_URI"]); die; } $fact = isset($_SESSION["factorial"]) ? $_SESSION["factorial"] : ""; unset($_SESSION["factorial"]); ?> <form action="" method="post"> <input type="text" name="text" > <input type="submit" name="click" value="Рассчитать факториал"> </form> <?= $fact; ?> Добавлено спустя 54 секунды: P.S. Считать факториал рекурсией - глупость, там цикл фор в 2 строчки лучше справится.
да, я именно такую логику и предлагаю но по традиции минирую логику фрагментами её отсутствия. ТС как бы должен задаться вопросом "а зачем тут вот этот мусор?" и переписать. мы же в форуме для новичков не для слепоглухонемых халявщиков. поддерживаю. опять же лимит рекурсии может неожиданно подкрасться.
Рассчет факториала, кстати, одна из задач, которую именно на примере рекурсии и показывают. Чисто чтоб понять, что это такое. Но в практическом плане да, не самое оптимальное решение. Нет у рекурсии лимита. Есть лимит размера колл-стэка. Но его исчерпать-таки тяжко.
Ага, и ещё - числа Фибоначчи, для которых тоже рекурсия не лучшее решение, но там хоть действительно без рекурсии кода раза в 2 больше нужно писать.