**一些背景:由於他的優秀解釋,信貸轉到布魯斯(sqlwork.com)。
此網頁需要您在之前輸入的數據才能正常顯示。您可以再次發送這些數據,但這樣做會重複此頁執行的任何操作。按重新加載重新發送該數據並顯示此頁面。
由於web開發瀏覽器的馬虎的編碼習慣的人被迫加入這個消息。方案如下:
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>
錯誤框
<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
你使用一臺服務器開放結束數據存儲? MySQL,Redis?最好的方法是在用戶導航時將數據存儲在服務器上。 –
由此你的意思是我需要在用戶會話期間存儲來自提交表單的所有值?我可以使用會話存儲嗎? –
您可以使用會話存儲,但它不是很適合擴展,並且如果每個數據量從一點點到多點都會變成錯誤的方式。我會說作業會話存儲是好的,對於生產來說是不夠的。 –