Проблема с моей реализацией шаблона Post / Redirect / Get
-
16-09-2019 - |
Вопрос
Я всегда использую Опубликовать / Перенаправить / Получить метод в моих формах.Мои формы, как правило, всегда подчиняются сами себе.Однако, когда у меня возникает ошибка в форме, я не отправляю никаких новых заголовков.Это для того, чтобы я мог легко делать подобные вещи
<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />
PHP - это просто библиотечная функция, которая обрабатывает 2 аргумента, ключ $_POST и значение по умолчанию, если оно отсутствует.
Это означает, что если кто-то допустит ошибку в форме, ему не придется заполнять форму второй раз.Недостатком является то, что при перезагрузке страницы они получают предупреждение POST в своем браузере.
Есть ли способ избежать этого, не используя что-либо для состояния (т.Е.файлы cookie, сеанс, база данных и т.д.)
Решение
Я нахожу, что лучший способ сделать это - использовать функцию заголовка.Вы можете опубликовать любой файл, который вам нужен, даже сам выполнить проверку, а затем использовать перенаправление заголовка, чтобы вернуться к форме, если это не удалось.Сохраните опубликованные значения в сеансе или другой доступной переменной, чтобы вы могли получить доступ к ранее введенным данным.
При использовании заголовка ("местоположение:myscript.php ");обязательно включите exit();впоследствии, в противном случае, вы все равно получите сообщение с предупреждением об обновлении.
myscript.php
if($_POST['submit'])
{
//check for errrors
if ($error)
{
$_SESSION['myPostVars'] = $_POST;
header("location: myscript.php");
exit();
}
}
<form>
// your form code
</form>
Редактировать:Я только что заметил, что вы отредактировали свой вопрос, чтобы избежать использования сеансов.
Вы могли бы сериализовать переменные post, которые вы хотите вернуть, и поместить их в строку запроса (отправленную через header()
Другие советы
Нет никакого способа избежать этого без сохранения состояния в сеансе.Когда вы сталкиваетесь с ошибкой, вы, вероятно, могли бы сделать что-то вроде следующего:
- сгенерируйте уникальный идентификатор
- скопируйте
$_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', ''); ?>" />
Возможно, вы также захотите прочтите этот учебник.
В принципе, ты делаешь это правильно.Нет особенно хорошего способа избежать предупреждений о "репостах".