Итак, вот сделка, я использую HTML-формы для переноса переменных со страницы на страницу и PHP-скрипта для создания страниц на основе представленных значений. В общем, это выглядит так: из каталога элементов вы выбираете то, что хотите, и на следующей странице отображаются детали этого конкретного элемента. Все работает отлично, кроме одного:
Всякий раз, когда я использую кнопку возврата браузера, я всегда получаю сообщение об ошибке: ERR_CACHE_MISS, и мне нужно обновить страницу, а затем подтвердить, что я действительно хочу повторно отправить данные.
Есть ли способ исправить это, поэтому мои клиенты смогут просто использовать кнопку «назад», как они предполагали.
Вот полный текст, который браузер предоставляет мне:
На этой веб-странице требуются данные, которые вы ввели ранее для правильного отображения. Вы можете отправить эти данные еще раз, но при этом вы повторите любое действие, которое ранее выполняла эта страница. Перезагрузить страницу Нажмите кнопку перезагрузки, чтобы повторно отправить данные, необходимые для загрузки страницы. Код ошибки: ERR_CACHE_MISS
Когда вы отправляете формы с php или любыми другими данными, вы можете вернуться на страницу и найти сообщение в браузере, например, «Истек срок действия документа» или «Подтвердить повторную отправку формы с помощью Chrome». Эти сообщения представляют собой меры предосторожности, которые браузер использует с конфиденциальными данными, такими как пост-переменные. Браузер автоматически не даст вам новую страницу. Вы должны перезагрузить страницу, нажав кнопку «Повторить попытку» или обновить страницу. Затем он работает так, как вы ожидали.
Тем не менее, php-кодер может обойти раздражающее сообщение от браузера, добавив немного кода в скрипт. В этом примере показано несколько строк кода, которые могут быть добавлены выше session_start (), чтобы можно было перемещаться назад и вперед на страницу, когда вы отправляете сообщения без каких-либо зависаний. Режим «private_no_expire» означает, что клиент не получит Истекший заголовок в первую очередь.
header('Cache-Control: no cache'); //no cache session_cache_limiter('private_no_expire'); // works //session_cache_limiter('public'); // works too session_start();
** Некоторые предпосылки: Кредит идет к Брюсу (sqlwork.com) за его отличное объяснение.
На этой веб-странице требуются данные, которые вы ввели ранее для правильного отображения. Вы можете отправить эти данные еще раз, но при этом вы повторите любое действие, которое ранее выполняла эта страница. Нажмите «Обновить», чтобы повторно отправить эти данные и отобразить эту страницу.
Из-за неаккуратных методов кодирования веб-разработчиков браузеры были вынуждены добавить это сообщение. сценарий выглядит следующим образом:
1) пользователь заполняет форму и отправляет (формы сообщений). 2) сервер обрабатывает почтовые данные и отвечает новой страницей (подтверждением), помеченной как не кэшируемая. 3) пользователь переходит на новую страницу. 4) пользователь нажимает:
для того, чтобы браузер отображал страницу на шаге 2, потому что ее отмеченный no-cache, он должен запросить его с сервера, другими словами, сделать репозицию данных (сделайте шаг 1). здесь было небрежное кодирование, если это была плата за кредитную карту, а обнаружение репозиции не было на сервере, карта взимается дважды. это было настолько распространенной проблемой, что браузеру пришлось обнаружить это и предупредить пользователей.
лучшее исправление находится на втором шаге, сервер отправляет перенаправление на страницу подтверждения. тогда, когда пользователь обращается к подтверждению через историю или обратно, его запрос на получение, а не запрос на отправку, и не будет показывать предупреждение.
примечание: модель обратной обратной связи Webform поддается этой проблеме. также избегайте передачи сервера.
Мое решение
$ _SESSION ['home'] используется для хранения любых ошибок на домашней странице.
$ _SESSION ['tempEmail'] используется для эхо-значения в форме php.
Примечание. Используйте одну уникальную переменную сеанса для каждой страницы с формой HTML для обработки ошибок, а также любую переменную сеанса для каждого значения, которое отображается в форме HTML.
<?php session_start(); //Initialize variables not initialized without overwriting previously set variables. if(!isset($_SESSION['home'])) { $_SESSION['home']=""; $_SESSION['tempEmail']=""; }
Необязательно. Если вы вошли в систему, назначьте адрес электронной почты переменной $ _SESSION ['tempEmail'] (если она еще не была сделана), чтобы предварительно заполнить форму HTML.
if(isset($_POST['Submit'])){ ---your code--- //Error message(s) examples $_SESSION['home'] = "Email and Password do not match, please try again."; header("Location: " . $_SERVER['REQUEST_URI']); $_SESSION['home'] = "Email address format is invalid. Please recheck."; header("Location: " . $_SERVER['REQUEST_URI']); //success unset ($_SESSION['home']); //optional, unset to clear form values. header ("location: nextpage.php"); ---or--- header("Location: " . $_SERVER['REQUEST_URI']); //re-post to same page with the $_SESSION['home'] success message. } ?> <body>
Поле ошибки
<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span>
Форма HTML
<form action="#" name="loginform" method="post" > <input type="text" name="userEmail" maxlength="50" title="Enter Your email" autocomplete="off" value="<?php echo htmlspecialchars($_SESSION['tempEmail']); ?>" placeholder="enter email" required/> <input type="submit" name="Submit" value="Submit"> </form> </body>
Не рекомендуется использовать на странице оплаты, см. Обсуждение выше. Протестировано в Firefox, Chrome, Safari и IE9. При использовании кнопки возврата неприятные сообщения исчезают. Убедитесь, что буферизация вывода включена в вашем php-скрипте или php.ini, чтобы избежать предупреждений заголовков. Вы можете проверить свой файл php.ini следующим образом;
output_buffering=On
Я обнаружил, что используя только:
header('Cache-Control: no cache'); //disable validation of form by the browser
решить проблему
Я попробовал этот ответ, и все в порядке. Вы должны поставить этот код до: session_start()
:
session_cache_limiter('private, must-revalidate'); session_cache_expire(60);
Удачи
<?php if(isset($_POST['submit'])) { //submission goes here } ?>
Это то, о чем вы думали?
edit – SQL действительно замечательная вещь для работы, я вижу, что она добавлена как рекомендация в комментарии, и я согласен использовать SQL, если можно, ее быстрый, интуитивный и эффективный.