Как заставить браузер повторно отправлять данные формы при использовании кнопки «Назад»?

Я предполагаю, что мой вопрос заключается в понимании обработки $_POST.

Итак, у меня есть две страницы, которые обрабатывают 2 формы. Страница 1 запрашивает некоторую информацию, которая будет использоваться на странице 2. При отправке действие формы использует ту же страницу, а затем перенаправляет на следующую страницу после проверки, но обрабатывает данные только тогда, когда переменная $_GET ?usersubmit=1.

<form action="<?=$_SERVER['PHP_SELF']?>?usersubmit=1" method="post" name="form1">
<input type="text" name="field1">
</form>

Итак, скажем, у меня есть страница с именем form1.php. После отправки он отправляется на form1.php?usersubmit=1. Теперь страница присваивает опубликованные данные переменным сеанса, а затем перенаправляет на form2.php через header('location:form2.php').

<? 
if($_GET['usersubmit']){
    if($_POST['field1']){
      #if valid then assign session variable and redirect to next form
      $_SESSION['field1'] = $_POST['field1'];
      header("location:form2.php");
    }else{
      #if invalid send error message 
      $error = true;
    }
}
?>

Моя проблема заключается в том, что пользователи нажимают кнопку «Назад» в своем браузере, чтобы редактировать данные из предыдущей формы. Браузер не публикует эти данные повторно, он просто показывает им пустую форму. Я бы предпочел не использовать данные $_SESSION для заполнения форм, потому что я подозреваю, что метод повторной публикации может быть более быстрым и менее проблематичным решением.

Я также попробовал перенаправление javascript вместо заголовка, но браузеры достаточно умны, чтобы не отправлять вас обратно на страницу, которая хочет перенаправить вас, чтобы она не работала.

любая помощь в понимании этого будет принята с благодарностью. благодаря.


person Jiminy Cricket    schedule 27.12.2011    source источник


Ответы (3)


Единственный способ справиться с этим - через сеанс... HTML5 позволяет хранить такие данные, но, честно говоря, я бы пока даже не рассматривал это как возможность, хотя это работает.

person Philip    schedule 27.12.2011

обычно кнопка «Назад» будет использовать все те же переменные получения и публикации, что и при загрузке страницы предыдущих местоположений. Перенаправление заголовка на стороне сервера не позволит вам использовать кнопку «Назад», чтобы перейти на предыдущую страницу, поскольку это перенаправление выполняется на стороне сервера.

существует два способа перенаправления с помощью javascript: window.location, который поместит ваше предыдущее местоположение в историю браузера, и поэтому кнопка «Назад» будет работать, и location.replace, который не поместит ссылку в вашу историю и, следовательно, не позволит вам использовать кнопку «Назад», чтобы перейти на предыдущую страницу.

в качестве альтернативы вы можете просто использовать вторую страницу для обработки первой страницы...

person dqhendricks    schedule 27.12.2011

Кроме того, вы должны использовать htmlentities() в своем коде. Он закрывает уязвимость системы безопасности (см. http://www.html-form-guide.com/php-form/php-form-action-self.html для более подробной информации).

<form action="<?=$_SERVER['PHP_SELF']?>?usersubmit=1" method="post" name="form1">

должно измениться на что-то вроде этого ниже.

<form action="<?=htmlentities($_SERVER['PHP_SELF'])?>?usersubmit=1" method="post" name="form1">

person user1114    schedule 27.12.2011