Проблема с моей реализацией шаблона Post / Redirect / Get

Я всегда использую метод Post / Redirect / Get в своих формах. Мои формы обычно всегда подчиняются себе. Однако, когда у меня есть ошибка в форме, я не отправляю никаких новых заголовков. Это так, я могу легко делать такие вещи, как это

<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" /> 

PHP – это просто функция библиотеки, которая обрабатывает 2 аргумента, ключ $ _POST и значение по умолчанию, если оно отсутствует.

Это означает, что если кто-то делает ошибку в форме, они не должны повторно заполнять форму во второй раз. Недостатком является то, что перезагрузка страницы дает им сообщение POST в своем браузере.

Есть ли вообще избежать этого, не используя что-то для состояния (например, файлы cookie, сеанс, база данных и т. Д.),

Solutions Collecting From Web of "Проблема с моей реализацией шаблона Post / Redirect / Get"

Я считаю, что лучший способ сделать это – использовать функцию заголовка. Вы можете публиковать сообщения о том, что когда-либо вам нужно, даже самому делать валидацию, а затем использовать перенаправление заголовка, чтобы вернуться к форме, если она не удалась. Храните значения 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> 

Изменить: я просто заметил, что вы отредактировали свой вопрос, чтобы избежать использования сеансов.

Вы можете сериализовать почтовые ящики, которые хотите вернуть, и поместить их в строку запроса (отправленную через заголовок ()

Невозможно избежать этого без сохранения состояния в сеансе. Когда вы сталкиваетесь с ошибкой, вы, вероятно, можете сделать что-то вроде следующего:

  1. генерировать уникальный идентификатор
  2. скопируйте переменную $_POST в сеанс, в котором указан уникальный идентификатор
  3. перенаправлять, как и сейчас, но передать уникальный идентификатор как часть строки запроса
  4. обновите свою библиотеку, чтобы искать этот уникальный идентификатор в сеансе (ошибки) вместо прямого доступа к переменной $_POST , если уникальный идентификатор не был передан по запросу или имя, которое вы ищете, не существует, используйте значение по умолчанию стоимость
  5. в конце запроса удалите уникальную запись из сессии. это экономит загрязнение сессии слишком большим количеством мусора. Вы также можете сделать это в начале запроса в зависимости от вашей библиотеки

Я думаю, вы имеете в виду что-то вроде этого:

 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».