2011-11-03 121 views
4

我在提交到同一頁面的php頁面上有一個表單。 我注意到,如果我重新加載/刷新頁面,表單會重新提交。 如何編碼以最簡單的方式避免此問題?在瀏覽器中重新加載/刷新頁面而無需重新提交表單?

+0

你可以嘗試重定向到一個頁面刷新。 – Blender

+3

http://en.wikipedia.org/wiki/Post/Redirect/Get –

+0

你不能......整個問題是,用戶輸入可能是必要的,以生成你當前所在的頁面。除非你有特殊的理由去改變它,否則我建議單獨留下這種行爲。如果你這樣做,你可以做Blender建議的事情,然後進入中間頁面,或者在進入下一頁之前通過AJAX發送你的數據。 – Brad

回答

2

一種可能性是,實施後的重定向,獲得的方法。

簡而言之,POST請求將永遠不會傳遞給瀏覽器。相反,你執行所有必要的行動,並存儲在會話中所需要的信息,然後你與代碼303

$page = 'show_result.php'; 
header('Location: '.$page, true, 303); 
exit; 

重定向這樣做,這樣,瀏覽器會顯示「show_result.php」頁面( GET請求)而不是使用POST請求的頁面。這也是添加到歷史記錄中的頁面,因此刷新並使用後退按鈕將永遠不會執行另一個POST請求。作爲一個很好的副作用,你可以擺脫關於重發數據的瀏覽器警告,通常用戶無論如何都不能決定該怎麼做。

我認爲這種方法最大的問題是,你需要一個會話來存儲錯誤消息,這意味着你必須依靠cookie。如果您沒有重定向來顯示錯誤,瀏覽器將顯示關於重新發送數據的警告。

+0

這對我有用 – Paul

+0

Post-redirect-get不需要會話,我不確定你的意思是「POST請求永遠不會傳送到瀏覽器」 – j08691

+0

@ j08691 - 每個POST請求都將被回答重定向(代碼303)。瀏覽器收到此答案並啓動一個新的GET請求,該請求顯示第一個請求的結果。當POST請求檢測到無效用戶輸入時,會話是必需的,並且以下GET請求需要顯示錯誤消息和最後一個用戶輸入。 – martinstoeckli

2

這假設了很多東西,但也許是你在找什麼:

if ($_POST) 
{ 
    $success = false; 

    /* 
    * if all goes OK managing POST data make $success = true; 
    * 
    */ 

    if ($success) 
    { 
     // this will redirects to your original 
     // form's page but using GET method 
     // so re-submitting will be no possible 
     header("location: {$_SERVER['PHP_SELF']}"); 
     exit; 
    } 
} 
+0

'PHP_SELF'將刪除任何GET參數。使用'REQUEST_URI'來保存它們。 – minipif

0

根據HTTP標準,您應該讓瀏覽器在發送POST後做GET請求。
這裏是一個草圖例子做表單處理:

<? 
if ($_SERVER['REQUEST_METHOD']=='POST') { 

    $err = array(); 
    //performing all validations and raising corresponding errors 
    if (empty($_POST['name']) $err[] = "Username field is required"; 
    if (empty($_POST['text']) $err[] = "Comments field is required"; 

    if (!$err) { 
    //if no errors - saving data and redirect 
    header("Location: ".$_SERVER['PHP_SELF']); 
    exit; 
    } else { 
    // all field values should be escaped according to HTML standard 
    foreach ($_POST as $key => $val) { 
     $form[$key] = htmlspecialchars($val); 
    } 
} else { 
    $form['name'] = $form['comments'] = ''; 
} 
include 'form.tpl.php'; 
?> 
相關問題