Я всегда использую метод Post / Redirect / Get в своих формах. Мои формы обычно всегда подчиняются себе. Однако, когда у меня есть ошибка в форме, я не отправляю никаких новых заголовков. Это так, я могу легко делать такие вещи, как это
<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />
PHP – это просто функция библиотеки, которая обрабатывает 2 аргумента, ключ $ _POST и значение по умолчанию, если оно отсутствует.
Это означает, что если кто-то делает ошибку в форме, они не должны повторно заполнять форму во второй раз. Недостатком является то, что перезагрузка страницы дает им сообщение POST в своем браузере.
Есть ли вообще избежать этого, не используя что-то для состояния (например, файлы cookie, сеанс, база данных и т. Д.),
Я считаю, что лучший способ сделать это – использовать функцию заголовка. Вы можете публиковать сообщения о том, что когда-либо вам нужно, даже самому делать валидацию, а затем использовать перенаправление заголовка, чтобы вернуться к форме, если она не удалась. Храните значения post'd в сеансе или другой доступной переменной, поэтому вы можете получить доступ к ранее введенным данным.
При использовании заголовка («location: myscript.php»); обязательно включите exit (); в противном случае вы все равно получите предупреждение POST при обновлении.
myscript.php
if($_POST['submit']) { //check for errrors if ($error) { $_SESSION['myPostVars'] = $_POST; header("location: myscript.php"); exit(); } } <form> // your form code </form>
Изменить: я просто заметил, что вы отредактировали свой вопрос, чтобы избежать использования сеансов.
Вы можете сериализовать почтовые ящики, которые хотите вернуть, и поместить их в строку запроса (отправленную через заголовок ()
Невозможно избежать этого без сохранения состояния в сеансе. Когда вы сталкиваетесь с ошибкой, вы, вероятно, можете сделать что-то вроде следующего:
$_POST
в сеанс, в котором указан уникальный идентификатор $_POST
, если уникальный идентификатор не был передан по запросу или имя, которое вы ищете, не существует, используйте значение по умолчанию стоимость Я думаю, вы имеете в виду что-то вроде этого:
function Value($array, $key, $default = false) { if (is_array($array) === true) { settype($key, 'array'); foreach ($key as $value) { if (array_key_exists($value, $array) === false) { return $default; } $array = $array[$value]; } return htmlspecialchars($array); } return $default; } <input type="text" name="email" value="<?= Value($_POST, 'email', ''); ?>" />
Вы также можете прочитать этот учебник .
Вы в основном делаете это правильно. Нет особого способа избежать предупреждений «repost».