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

StackOverflow https://stackoverflow.com/questions/1678763

  •  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()

Другие советы

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

  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', ''); ?>" />

Возможно, вы также захотите прочтите этот учебник.

В принципе, ты делаешь это правильно.Нет особенно хорошего способа избежать предупреждений о "репостах".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top