Intereting Posts

Предотвращение повторной отправки формы при нажатии кнопки возврата

Я искал много сообщений здесь и в других местах, но не могу найти решение моей проблемы. У меня есть страница, которая отображает записи базы данных: database.php. Эти записи могут быть отфильтрованы с помощью формы. Когда я их фильтрую и показываю только те, которые меня интересуют, я могу щелкнуть запись (как ссылку), которая приведет меня к этой странице записей (через php GET). Когда я нахожусь на этой странице записей (т. Е. «View.php? Id = 1») и нажимаю кнопку «Назад» (back to database.php), форма фильтра требует подтверждения повторной отправки формы. Есть ли способ предотвратить это?

вот некоторые (упрощенные) примеры кода:

database.php:

<form> <select> <option>1</option> <option>2 <option> </select> <input type="submit" name="apply_filter" /> </form> <?php if ( isset( $_POST[ "apply_filter" ] ) ) { // display filtered entries $filter = $_POST[ "filter" ]; $q = "Select * from table where col = '" . $filter . "'"; $r = mysql_query( $q ); } else { // display all entries $q = "Select * from table"; $r = mysql_query( $q ); } while ( $rec = mysql_fetch_assoc( $r ) ) { echo "<a href='view.php?id=" . $rec[ "id" ] . "'>" . $rec[ "name" ] . "</a><br />"; // this is where the link to the view.php page is... } ?> 

Теперь, как уже упоминалось, если я нажму ссылку, это приведет меня к «view.php? Id = whatever». На этой странице я просто получаю идентификатор от URL-адреса, чтобы отобразить эту единственную запись:

view.php:

 <?php $id = $_GET[ "id" ]; $q = "Select * from table where id = '" . $id . "'"; $r = mysql_query( $q ); while ( ) { // display entry } ?> 

Если я сейчас нажал кнопку «Назад», форма на database.php (тот, который используется для фильтрации результатов БД) требует подтверждения для повторной отправки. Не только это очень раздражает, но и бесполезно для меня.

Как я могу это исправить? Надеюсь, что примеры кода и объяснение моей проблемы достаточно. Если не сообщите мне, и я попытаюсь указать.

Solutions Collecting From Web of "Предотвращение повторной отправки формы при нажатии кнопки возврата"

Я знаю, что этот вопрос старый, но, имея эту проблему, две строки, которые я обнаружил, это:

 header("Cache-Control: no cache"); session_cache_limiter("private_no_expire"); 

Есть два способа, которыми я это знаю. Простой способ и трудный путь.

Независимо от того, когда вы работаете с государственной страницей (используя $_SESSION ), которую вы должны делать, чтобы ваши страницы «живы» и под вашим контролем, предотвращает кеширование всех страниц:

 <?php //Set no caching header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d MYH:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); ?> 

Трудный способ заключается в создании идентификатора и его хранении на странице в виде скрытого ввода или файла cookie &_SESSION . Затем вы сохраняете тот же идентификатор на сервере, что и $_SESSION . Если они не совпадают, серия запрограммированных команд if else вызывает ничего, потому что страница повторно отправляется (это то, что она пытается сделать, когда вы нажимаете назад).

Легкий способ – просто перенаправить пользователя обратно на страницу отправки формы, если форма была успешно отправлена, например:

 header('Location: http://www.mydomain.com/redirect.php'); 

Надеюсь, это поможет!

Одна вещь, которая может помочь, заключается в том, чтобы ваша форма фильтра использовала метод GET вместо POST .

Браузеры обычно препятствуют автоматическому повторному отправке POST ввода, что не делает, когда используется вход GET . Кроме того, это позволит пользователям ссылаться на вашу страницу с помощью фильтра.

Вам необходимо удалить запрос, данные POST из истории браузера

 history.replaceState("", "", "/the/result/page") 

См. Этот ответ

Также вы можете следовать шаблону Post/Redirect/Get .