作者 主題: 如何防止重複post表單呢?  (閱讀 14793 次)

0 會員 與 1 訪客 正在閱讀本文。

hotswin

  • 違規-不可貼文
  • 憂鬱的高中生
  • *
  • 文章數: 103
    • 檢視個人資料
    • 電梯
如何防止重複post表單呢?
« 於: 2010-12-10 22:10 »
你好:

請敖一下,我目前的submit 表單 post之後
database 常出現重複的記錄,可能是按refresh造成的
有什麼防止這種情況呢?

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 如何防止重複post表單呢?
« 回覆 #1 於: 2010-12-10 22:25 »
你好:

請敖一下,我目前的submit 表單 post之後
database 常出現重複的記錄,可能是按refresh造成的
有什麼防止這種情況呢?

最簡單的就是在資料處理完畢之後
用 header("Location: xxxxxx") 導到其他頁
這樣就算 user 按重新整理或回上頁
也不會回到接收資料那頁

hotswin

  • 違規-不可貼文
  • 憂鬱的高中生
  • *
  • 文章數: 103
    • 檢視個人資料
    • 電梯
回覆: 如何防止重複post表單呢?
« 回覆 #2 於: 2010-12-27 11:13 »
你好:

請敖一下,我目前的submit 表單 post之後
database 常出現重複的記錄,可能是按refresh造成的
有什麼防止這種情況呢?
最簡單的就是在資料處理完畢之後
用 header("Location: xxxxxx") 導到其他頁
這樣就算 user 按重新整理或回上頁
也不會回到接收資料那頁
我有試著修改您的方式,但仍然會出現重複的記錄
不過修改後,重複的次數較之前不頻繁
不知道 這種情況 user是怎麼做 submit ?



ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
回覆: 如何防止重複post表單呢?
« 回覆 #3 於: 2010-12-27 12:06 »
為了避免User不小心按下refresh一直重複submit
可以在表單中埋入一個hidden欄位給他一個隨機值
並且在session中紀錄這個隨機值
當完成表單post後,就把這個隨機值從session中刪除
所以當User是重複按下refresh或是按上一頁重新submit時
表單中hidden欄位的數值勢必跟session紀錄的不一樣,就可以知道這是重複送出的form了。
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

hikohan

  • 俺是博士!
  • *****
  • 文章數: 1288
    • 檢視個人資料
回覆: 如何防止重複post表單呢?
« 回覆 #4 於: 2010-12-27 14:32 »
中間打一個洞看看。

ex:

doc.form.submit() -> null page -> complete -> redirect

redirect可以清document.history,於complete頁面偵測refer(遇到踢至err page)。

打完,大概重複發送表單的問題也杜絕了。
lifeIsFunWithPHP.

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
回覆: 如何防止重複post表單呢?
« 回覆 #5 於: 2010-12-27 15:45 »
另外一個常見的處理方式是這樣

把表單的頁面跟POST的對象頁面設為同一個
像這樣
<form action='' method='post'> ...</form>
當表單被submit時會被送到原本產生form的路徑去
在php的程式中透過$_SERVER['REQUEST_METHOD']可以得知目前的request method
$_SERVER['REQUEST_METHOD']=>GET    送出form的表單
$_SERVER['REQUEST_METHOD']=>POST  表示User按下submit
接下來的處理流程就一樣樓
處理完submit該做的事情後透過header('location=xxxx');導向結果頁面。
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
回覆: 如何防止重複post表單呢?
« 回覆 #6 於: 2010-12-28 08:51 »
用 AJAX POST 資料,就不怕 Reflash!
--
TyroneYeh

christ756

  • 可愛的小學生
  • *
  • 文章數: 15
    • 檢視個人資料
回覆: 如何防止重複post表單呢?
« 回覆 #7 於: 2011-02-21 13:25 »
小弟是初學者,方法有點拙 :)
假如:填寫頁→紀錄頁→顯示紀錄完成頁
方法1.我會在填寫頁紀錄一個cookie,在紀錄完成頁會刪除此cookie,在紀錄頁判斷此cookie是否存在,存在才紀錄,不存在就轉頁到其他地方。
方法2.在紀錄頁echo "<Script language='javascript'>if(window.history.forward(1) != null)   window.history.forward(1);</Script>"; //防止從紀錄完成頁按上一頁回紀錄頁,然後轉到紀錄完成頁
當然也可以兩個一起用0.0
« 上次編輯: 2011-02-21 13:39 由 christ756 »

fattomhk

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
回覆: 如何防止重複post表單呢?
« 回覆 #8 於: 2011-02-21 16:32 »
為了避免User不小心按下refresh一直重複submit
可以在表單中埋入一個hidden欄位給他一個隨機值
並且在session中紀錄這個隨機值
當完成表單post後,就把這個隨機值從session中刪除
所以當User是重複按下refresh或是按上一頁重新submit時
表單中hidden欄位的數值勢必跟session紀錄的不一樣,就可以知道這是重複送出的form了。
雖然Ajax可以解決refresh問題,但是Ajax也可以不停call啊,
所以版主提供的方法好像更有效 :o
COOKIE的方法與版主的理念相同吧,但是板主的應該比較安全

linlong3388

  • 可愛的小學生
  • *
  • 文章數: 2
    • 檢視個人資料
回覆: 如何防止重複post表單呢?
« 回覆 #9 於: 2011-04-26 17:54 »
不妨貼程式碼來看看~
或許 ,問題不在post ,而是層層且複雜的迴圈造成的問題~ :)