2010-04-26 73 views
0

我很抱歉,如果這已被問過,但我覺得我的情況有點不同......記住表格的信息

我有一個巨大的形式(如50個問題,涉及複選框,下拉菜單,文本框和textareas)

當用戶提交表單並且驗證頁面發出錯誤時,是否有簡單的方法來保存它們輸入的信息?

我的intitial表單在form.php上,然後表單操作是form_posted.php,在form_posted.php上運行任何東西之前我有我的驗證代碼,它將用戶發送回form.php並顯示錯誤號碼(例如.form.php?error = 3)如果有任何特別的問題。這與

header("form.php?error=3")

所以,當我回來的form.php的不張貼存在變數呢?即使這個頁面並沒有專門發送任何發佈的變量。

此外,如果是這樣的話,它是完全安全的做一個文本框的價值是什麼?

<input type="text" value="php echo $_POSTED["username"] ?>">

回答

2

您應該使用sessions來處理這個問題。在你的表單處理代碼,設置從$ _POST陣列(你認識)的每個元素,到一個會話變量如:現在

session_start(); 

$_SESSION["myField"] = $_POST["myField"]; 
$_SESSION["myField2"] = $_POST["myField2"]; 

,如果您重定向回到初始表單頁面(例如,如果有是錯誤的),您可以使用例如:

<input type="text" name="myField" value="<?php echo $_SESSION["myField"]; ?>" /> 

預先填充字段。您需要將<?php session_start(); ?>添加到表單頁面的頂部,以確保您設置的會話變量可用於表單。

+0

這可以工作謝謝您先生,如果我們做了$ _POST = $ _SESSION?這可能會帶來安全風險嗎?我有「只登錄」網站上的情況下,其他地方該用,如果觸發($ _ SESSION [「用戶名」])。在所討論的頁面上,由$ _SESSION [「username」] – 2010-04-26 22:31:10

+1

SESSIONS操縱的登錄框不存在主要的安全風險,因爲它們存儲在服務器端。 – ggfan 2010-04-26 22:39:40

0

會話是你所需要的。請不要猶豫,閱讀fine manual :)

+0

所以提取的帖子,並設置所有會話變量:) – 2010-04-26 21:56:57

+0

是或?。你可以存儲整個'$ _POST'到一個會話變量。但作爲一個更好的選擇,我可以建議你使用相同的腳本來顯示錶單和處理表單數據。這是一種普遍接受的方法,多次簡化了事情。如果你對代碼有很好的理解,並且很少有時間重構,我建議你這樣做。一般模式是'if(isset($ _ POST ['submit'])){$ error = validate($ _ POST); if($ error == false){process_form();重定向($ done_page);/* 303請參閱其他* /}} display_form($ error);' – codeholic 2010-04-26 22:08:52

1

如果您需要將用戶重定向到表單頁面而不是僅顯示一次,則會話很有用。如果可能的話,最好不要重定向用戶。 POST請求通常比GET請求在緩存方面的問題少。有些瀏覽器在緩存中感到有點樂觀,然後如果您還沒有這樣做,則必須將緩存信息添加到頁面中。

最好不要打斷他們對刷新按鈕的操作心態。作爲用戶,如果99%的時間刷新頁面,我希望頁面可以給我相同的輸出。 (值得注意的例外是使用CAPTCHA和註冊表格的形式,這兩種形式對重新提交的反應都很好)。大多數瀏覽器都會詢問用戶是否確定要重新提交表單。

如果你想使用會話,你將需要在兩個頁面上使用session_start()函數。在表單頁面上獲取會話信息,並在提交頁面上將其保存到會話中。我不建議將整個$ _POST數組存儲到一個會話變量中,你不知道那裏有什麼或者需要多少空間。你可以看看richsage如何在$ _SESSION中存儲$ _POST信息的答案。您可能還需要考慮存儲你想要的字段中的數組,並使用數組來保存像這樣的信息:

$allowed_fields = array('name', 'company', 'email'); 
foreach($allowed_fields as $field) { 
    if(isset($_POST[$field])) { 
    $_SESSION[$field] = $_POST[$field]; 
    } 
} 

當outputing回的形式,一定要逃出輸出,像用htmlspecialchars( )或ヶ輛()「>ヶ輛()像這樣:

<input type="text" name="myField" value="<?php echo htmlspecialchars($_SESSION['myField']); ?>" /> 

否則你的代碼將是值得懷疑的,以XSS (Cross Side Scripting)