Я искал много сообщений здесь и в других местах, но не могу найти решение моей проблемы. У меня есть страница, которая отображает записи базы данных: 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 (тот, который используется для фильтрации результатов БД) требует подтверждения для повторной отправки. Не только это очень раздражает, но и бесполезно для меня.
Как я могу это исправить? Надеюсь, что примеры кода и объяснение моей проблемы достаточно. Если не сообщите мне, и я попытаюсь указать.
Я знаю, что этот вопрос старый, но, имея эту проблему, две строки, которые я обнаружил, это:
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
.