2013-10-07 65 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)。

此網頁需要您在之前輸入的數據才能正常顯示。您可以再次發送這些數據,但這樣做會重複此頁執行的任何操作。按重新加載重新發送該數據並顯示此頁面。

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

當你發佈使用PHP的形式,或任何其他數據,你可能會回到該網頁,尋找像「文檔過期」或「確認重新提交表單有了Chrome」瀏覽器的消息。這些消息是瀏覽器使用敏感數據(如post變量)的安全防範措施。瀏覽器不會再自動給你新的頁面。您必須重新加載頁面,方法是再次單擊「嘗試」或刷新頁面。然後,它按照您的預期運行。

但是,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 

解決問題