2012-12-15 126 views
5

我不知道有什麼技術可以用來避免用戶在刷新頁面時再次發表表單兩次並選擇再次提交?

例如我已經在regiter.php之內形成並在register.php中處理它。

1st我可以在另一個文件中處理例如register_process.php並重定向到register.php,但我不得不創建約20個新頁面,並重新定位了很多代碼,我不想要這個選項。

第二我可以headers打我不記得確切的伎倆,但曾與一些不愉快的經歷 - 看到網頁上的舊數據刷新之後用戶...

我能在成功只是重新定位一些dummy.phpdummy.php跳回register.php那麼即使他們刷新頁面瀏覽器不會重新發布,但它並不能防止他們使用後退按鈕和c hoosing重新發布,我知道我可以過期頁面​​,但我發現我討厭的經驗,可能其他用戶看到頁面過期的錯誤。

4th對每個表單使用一些獨特的「訪問鍵」,一旦頁面加載後將與表單一起使用,一旦使用無法重用,但我有種與該功能的邏輯鬥爭。如何知道密鑰沒有存儲在MySQL DB中,我認爲基於時間的訪問不是很好,或者是因爲一些用戶在頁面打開和表單提交之間可能需要很長時間。

我需要更多的建議如何避免用戶重新發布窗體。

回答

1

試試這個:

<?php 
session_start(); 
if(strcasecmp($_SERVER['REQUEST_METHOD'],"POST") === 0) { 
    $_SESSION['postdata'] = $_POST; 
    header("Location: ".$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']); 
    exit; 
} 
if(isset($_SESSION['postdata'])) { 
    $_POST = $_SESSION['postdata']; 
    unset($_SESSION['postdata']); 
} 

這將基本上保存POST數據並導致瀏覽器重新請求爲GET請求。

+0

我做了類似的事情,但是用多行代碼:) 問題是,如果他們提交表單前刷新頁面,'$ _SESSION [「POSTDATA」]'不會存在了 附:使用'strcasecmp($ _ SERVER ['REQUEST_METHOD'],「POST」)'而不是'$ _SERVER ['REQUEST_METHOD'] ==「POST」''的好處? –

1

5th。使用AJAX或jQuery,當頁面上的表單被點擊時在後臺提交數據。輸出一個響應到屏幕。將該表單標記爲已提交,或保存到會話中,並且在刷新時他們將無法再次提交表單。

在我看來,這是最好的辦法。我有一個有20個或更多表格的記分牌,它非常好地發送數據而無需刷新。您可以返回回覆並使頁面看起來非常專業。使用jQuery,你也可以使用一些很棒的表單驗證來確保他們提交需要的字段。

+0

不,謝謝,我不想使用,因爲兼容性問題的任何形式的JavaScript只是HTML和PHP –

0

當你考慮第一個選項,我不知道你的網站的設計(編程設計^^),但你應該只需要1頁。讓我們說你帶着所有的參數調用redirect.php,你應該調用你的控制器,你的控制器應該知道如何處理它們。

編程時能夠做一些抽象和優秀的設計是一種好習慣,它在這些情況下很有幫助。

+0

我在想仍然考慮什麼是最好的。 –

0

我認爲,最好的解決辦法是這樣的:
*創建一個MD5或發佈數據的base64
*同一個會話變量比較這哈希(我們稱之爲$ _SESSION [轉貼'])
*如果散列匹配,跳過任何保存這應該做的和輸出警告
*如果哈希值不匹配,或哈希不存在
*分配會話變量與當前哈希
*作事保存應該做

+0

base64不會創建散列,但會將8位數據編碼爲與代碼頁無關的ASCII字符。使用base64編碼8mb的數據將大於8mb,創建8mb數據的md5散列將導致16字節長的散列。 – hmundt

0

其他方式是st礦石在會話變量中的最後一個職位,並檢查是否是平等的,就像這樣:

<?php 
... program ... 
if ($_SESSION['PREPOST'] == $_POST) { 
    // DO SOMETHING 
} 
... program ... 
$_SESSION['PREPOST'] = $_POST; 
?> 
相關問題