Запретить повторную отправку формы после нажатия кнопки «Назад»

У меня 2 страницы:

page1.php:
– имеет форму с текстовым полем и кнопкой «отправить». Например: <form name="frm_register" action="page1.php" method="post">

– php и mysql-код для хранения значения текстового поля в базе данных. Javascript перенаправит страницу на php2.php после того, как значение будет отправлено в базу данных. Например:

 $query = "INSERT INTO traceuser (username) VALUES ('{$username}')"; $result = mysql_query($query, $connection); echo '<script language="javascript">window.location="page2.php";</script>'; 

page2.php
– mysql извлекает данные из базы данных и выводит их на эту страницу.

Проблема. Когда я нажимаю кнопку «назад», браузер выдает предупреждающее сообщение о том, что форма будет повторно отправлена. Как предотвратить повторную отправку формы при нажатии кнопки «Назад»? Нужно ли мне очищать кеш страницы1.php? Как это сделать с помощью php или javascript или ajax?


Обновление 1: Спасибо за ответ на замену javascript window.location="page2.php" на header('Location: home2.php'); php header('Location: home2.php'); , Это исправляет 80% проблемы. Остальные 20% проблемы показаны ниже:

  if (strtotime($_SESSION['servertime']) < time()-3){ //10800 = 3 hours 3600 = 1 hour if (($username != "") AND ($username != $_SESSION[username])){ $_SESSION['servertime'] = $servertime; $_SESSION['username'] = $username; $query = "INSERT INTO traceuser (username) VALUES ('{$username}')"; $result = mysql_query($query20, $connection); header('Location: page2.php'); exit; } else { echo "same name"; //problem here } }else{ echo "submit multiple data too fast"; //problem here too. } } 

Проблема возникает, когда выполняются следующие шаги:
1) Пользователь успешно передает данные, переходите к записи просмотра page2.php.
2) Нажмите кнопку «Назад», вернитесь на страницу 1.php.
3) Ошибка передачи данных пользователя, оставайтесь на странице 1.php. (потому что слишком быстро или одно и то же имя)
4) Пользователь передает данные успешно, перейдите на страницу2.php просмотреть записи.
5) Пользователь нажимает кнопку «назад», но браузер показывает предупреждающее сообщение «Форма будет повторно отправлена».

Проблема состоит в том, что в шаге 3. Шаг 3 не запускал header('Location: page2.php'); , не перешел на страницу2.php. Таким образом, на шаге 5 отображается предупреждающее сообщение. Как решить эту проблему?


Обновление 2: Я решил решить проблему 20%, она работает отлично. Я использую session['error123'] чтобы решить, нужно ли отображать сообщение об ошибке «с тем же именем». Я убиваю session['error123'] если удастся отправить данные в базу данных или если успех перейдет на страницу2.php. Я также использую header('Location: page1.php'); перенаправить на собственную страницу (на той же странице), чтобы страница забыла о представлении формы ранее. Пример кодов:

 if ($_SESSION['error123'] == "toofast"){ echo $_SESSION['error123'] ; }elseif ($_SESSION['error123'] == "samename"){ echo $_SESSION['error123'] ; } if (strtotime($_SESSION['servertime']) < time()-3){ //10800 = 3 hours 3600 = 1 hour if (($username != "") AND ($username != $_SESSION['username'])){ $_SESSION['username'] = $username; $query = "INSERT INTO traceuser (username) VALUES ('{$username}')"; $result = mysql_query($query20, $connection); $_SESSION['error123'] = "aa"; header('Location: http://localhost/plekz/page2.php'); exit; } else { $_SESSION['error123'] = "samename"; header('Location: http://localhost/plekz/page1.php'); exit; } }else{ $_SESSION['error123'] = "toofast"; header('Location: http://localhost/plekz/page1.php'); exit; } } } 

Примечание. Вы должны буферизовать вывод <?php ob_start();?> Потому что $ _SESSION не может поставить перед header (). Буфер остановит весь вывод, включая сеанс, пусть заголовок () отправит результат первым.

Скорее, чем

echo '<script language="javascript">window.location="page2.php";</script>';

вы должны использовать функцию header () для перенаправления пользователя после отправки.

Таким образом, в коде psuedo,

нажмите кнопку «Отправить» на странице. php action page1.php page1.php отправляет данные в вызовы базы данных

 header('Location: http://example.com/page2.php'); 

Это должно предотвратить проблему с щелчком

Вы можете предотвратить повторное представление путем внедрения Post-Redirect-Get (шаблон PRG) .

Если у вас есть функция http_redirect это может быть http_redirect :

 http_redirect("page2.php"); 

Вместо вашего javascript-эха.

Если нет, это две строки:

 header("Location: http://example.com/page2.php"); exit; 

Замените example.com своим именем хоста сайта.

Связано: кнопка «Назад» повторно отправляет данные формы ($ _POST) ; Я запутался в PHP Post / Redirect / Get

Один из способов – отправить Formdata через Ajax на удаленный скрипт, и если запрос вернет успех, вы можете перейти на страницу «Спасибо». Таким образом, пользователь может нажать кнопку «Назад», и запрос «Обновить» не появляется.

Надеюсь, что эта идея поможет вам

Можете ли вы сделать это с помощью вызова Ajax? Никаких действий в форме, и подача вызовет функцию Ajax. Вызов Ajax выполнит запрос и предоставит ответ (вы можете просто эхо-результат), и затем вы можете предоставить динамическую обратную связь на основе результата. Вы никогда не покинете страницу.

 <form id="thisForm"> ...form input fields... <input type="button" onclick="return submitForm('thisForm')"/> </form> function submitForm(formId) { $.ajax( { type: "post", url: 'page2.php', data: $('#' + formId + ' input').serialize(), ... any other Ajax parameters..., success: function(data) { } }); return false; } 

Добавьте этот код на страницу, которая отображается как офлайн, когда пользователь нажимает кнопку «Назад»:

 <?php session_start(); header_remove("Expires"); header_remove("Cache-Control"); header_remove("Pragma"); header_remove("Last-Modified"); ?> 

Создайте сеанс, как показано здесь.

Вы должны использовать сеанс и проверять пользователя с каждой страницы, и вы будете удивлять, как работает СЕССИЯ! УДИВИТЕЛЬНО!