2

我有一個包含80個以上動態生成輸入框的頁面,當用戶將表單提交到另一個.php頁面並且其中一個輸入包含非數值的值時,它將使用:<?php header("Location: javascript:history.back()"); ?>將它們發送回輸入頁面,同時它將錯誤註冊到會話變量中。之所以使用javascript:history.back(),是因爲它存儲了表單中的值,即使您按下後退按鈕。但是因爲它正在緩存頁面,所以我不能在同一個.php腳本中輸出錯誤,所以我添加了一個元素和一些Ajax代碼。 Ajax代碼檢索名爲error.php另一個文件,這包含:讓jQuery在按下後退按鈕時觸發Ajax請求

<?php 
header("Cache-Control: no-cache"); 
session_start(); 
if(isset($_SESSION['error'])) 
{ 
    echo $_SESSION['error']; 
    unset($_SESSION['error']); 
} 
?> 

這是當頁面加載它自己的,而不是在history.back()時,它看起來像下面在不觸發檢索:

<script type="text/JavaScript"> 
$(document).ready(function(){ 
    $("#error p").load("error.php"); 
}); 
</script> 

任何想法?

感謝,
賈斯汀

+2

我知道這可能不是你想聽到的,但這是一個相當不可靠表單驗證的方式。你依靠瀏覽器來做一些可能或不可以做的工作,即:'因爲它存儲了表單中的值,即使你按下後退按鈕。一個更好的方法是像你一樣提交到頁面,但讓php重新渲染表單(最可能使用包含),並向用戶指出錯誤,用你已經擁有的數據填充表單因爲用戶剛剛提交了它。 – Groovetrain 2011-03-20 16:56:45

+1

此外(我說的很多:)),如果你真的想保持瀏覽器的歷史清潔,我會建議提交表單與Ajax,並轉發他們一起,如果它提交成功。也許我應該把這些作爲答案.... – Groovetrain 2011-03-20 16:58:18

+0

謝謝,這是關於時間,我清理了一些我的代碼...:D – Justin 2011-03-20 17:03:01

回答

0

你可以完全避免提交表單,並通過Ajax調用發送數據 - 服務器可以驗證數據併發送回不是「成功」或列表的驗證錯誤。

如果成功,移動到下一個URL(可能是一起成功的消息中指定)

如果失敗,修改當前頁,表明什麼問題了。這避免了你必須重新創建整個表單(因爲你永遠不會離開頁面),但也允許可靠的服務器端驗證

1

使用header("Location: javascript:history.back()")一般是不明智的。

使用絕對路徑,即

header('Location: /forms/input.php');

+0

有時絕對路徑不是一種選擇,在這些情況下,javascript:url完全受支持且有效。 – 2011-04-18 06:05:52

+1

絕對路徑通常總是一個選項,並且是最佳選項。如果您需要返回引薦網址,請使用引薦來源網址。如果您使用這種技術,並且用戶在其瀏覽器中禁用了JavaScript,則您的網站將被擰緊。總體而言,使用這種技術很便宜,不利於調試,嚴重降低可怕的實踐。沒有好的編碼人員會建議使用內聯'javascript:'作爲重定向。 – 2011-04-18 07:16:49

+0

+1我不同意downvote - javascript網址是一個可怕的想法。你將2個不相關的技術放在一起,並相信一個未知的瀏覽器將其排除。對我來說聽起來不像是一種好的做法 – Basic 2011-04-18 13:08:30