2013-10-07 2 views
10

Итак, вот сделка, Я использую HTML-формы для переноса переменных со страницы на страницу и PHP-скрипта для создания страниц на основе представленных значений. В целом это выглядит так: из каталога товаров вы выбираете то, что хотите, и на следующей странице отображаются детали этого конкретного элемента. Все работает отлично, за исключением одной вещи:перейти назад с отправкой формы PHP

Всякий раз, когда я использую кнопку назад браузера, я всегда получаю ошибку: ERR_CACHE_MISS и мне нужно, чтобы обновить страницу и затем подтвердить, что я действительно хочу, чтобы повторно данные.

Есть ли способ исправить это, поэтому мои клиенты смогут просто использовать кнопку возврата, как они предполагали.

Вот полный текст, который браузер предоставляет мне:

This webpage requires data that you entered earlier in order to be properly displayed. You can send this data again, but by doing so you will repeat any action this page previously performed. Reload this webpage. Press the reload button to resubmit the data needed to load the page. Error code: ERR_CACHE_MISS

+2

Вы открыты для использования сервера хранения конечных данных? MySQL, Redis? Лучший способ - хранить данные на сервере, когда пользователь перемещается. –

+0

, и этим вы подразумеваете, что мне нужно хранить все значения из представленных форм во время сеанса пользователя? Могу ли я использовать для этого хранилище сеансов? –

+0

Вы можете использовать хранилище сеансов, но оно не очень масштабируемо и становится неправильным способом, если количество данных в каждом случае будет немного меньше, чем немного. Я бы сказал, что для домашней сессии сеансовое хранение в порядке, для производства этого недостаточно. –

ответ

0
<?php 
if(isset($_POST['submit'])) 
{ 
//submission goes here 
} 
?> 

Является ли это то, что вы думали?

Редактировать - SQL действительно красиво работать, я вижу, что он добавлен в качестве рекомендации в комментарии, и я согласен использовать SQL, если можно, его быстрый, интуитивно понятный и эффективный.

+2

Нет даже немного – ElefantPhace

8

** Некоторые фон: Кредит отправляется в Брюс (sqlwork.com) за отличное объяснение.

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

Из-за неаккуратных методов кодирования веб-разработчиков браузеры были вынуждены добавить это сообщение. Сценарий выглядит следующим образом:

1) пользователь заполняет форму и отправляет (сообщения формируют) 2) сервер почтовые данные и отвечает на новую страницу (подтверждающим) отмечен как не кэшируется 3) пользователь переходит на новую страницу. 4) пользователь нажимает:

для браузера, чтобы отобразить страницу на шаге 2, поскольку ее отмеченный no-cache, он должен запросить его с сервера, другими словами, сделать репозицию данных (do шаг 1). здесь было небрежное кодирование, если это была плата за кредитную карту, а обнаружение репозиции не было на сервере, карта взимается дважды. это было настолько распространенной проблемой, что браузеру пришлось обнаружить это и предупредить пользователей.

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

примечание: модель обратной обратной связи webform поддается этой проблеме. также избегайте передачи сервера.

Мое решение

$ _SESSION [ 'домой'] используется для хранения каких-либо ошибок на домашней странице.

$ _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> 

окно Error

<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 
18

Когда вы размещаете формы с PHP, или любые другие данные, вы можете вернуться на страницу и найти сообщение в браузере, как «Документ Expired» или «Подтвердить повторную отправку формы с хромированными». Эти сообщения представляют собой меры предосторожности, которые браузер использует с конфиденциальными данными, такими как пост-переменные. Браузер автоматически не даст вам новую страницу. Вы должны перезагрузить страницу, нажав кнопку «Повторить попытку» или обновить страницу. Затем он работает так, как вы ожидали.

Однако, 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(); 
2

Я пробовал этот ответ, и все в порядке. Вы должны поместить этот код перед: session_start():

session_cache_limiter('private, must-revalidate'); 
session_cache_expire(60); 

удачи

4

я обнаружил, что, используя только:

header('Cache-Control: no cache'); //disable validation of form by the browser 

решить проблему

Смежные вопросы