2010-03-30 100 views
2

在我的網站上,我有一個用戶填寫成爲會員的表格。他們填寫姓名,bday,電子郵件等。然後當他們點擊提交時,數據就會進入mySQL。但有時當用戶點擊提交多次或刷新頁面時,數據會不止一次輸入到數據庫。我怎樣才能防止這種意外提交?有沒有我可以用來讓一組數據進入數據庫的代碼?我如何防止重複entrys到mySQL?

這在我的評論部分也是一個問題。我允許用戶對個人資料發表評論。但是當他們濫用刷新按鈕或提交按鈕時,我會得到10條相同的評論。我試圖防止用戶意外提交兩次評論。

謝謝。

回答

5

在第一種情況下,您可能只想在電子郵件地址中添加唯一索引並使用該索引爲該用戶創建配置文件。

在第二種情況下,據我所知,您試圖防​​止用戶意外提交數據兩次,而不是完全防止數據被提交兩次。你可能不想阻止人們在同一頁面上兩次寫同一評論。如果有人寫道「今天像昨天一樣!」,你不想阻止他們在第二天回來寫作「今天像昨天一樣!」再次。這將是不自然的,並且檢查可能是昂貴的,因爲它需要索引大量數據。無論數據是否相同,我想你都想阻止某人提交兩次相同的表單。

因此,第二個示例的解決方案是在表單中包含一個隱藏字段,用於唯一標識它。當他們提交表格時,將隱藏字段中的值標記爲已使用。如果稍後某人在隱藏字段中提交了具有相同值的表單,則拒絕該表單。

+0

然後一些smartass攻擊你隱藏的領域(甚至我的媽媽可以做到這一點),你又有兩倍的數據。 – 2010-03-30 19:33:10

+0

@Frank:我認爲你誤解了我的觀點。閱讀我更新後的文章,我將更詳細地解釋它。 – 2010-03-30 19:48:29

+0

是的,我試圖防止意外提交數據兩次。 – ggfan 2010-03-30 19:50:25

3

服務器端:實施節流。只允許每10秒左右提交一次。

更新:當您接受表單提交,請記錄您 在$ _SESSION提出劃界案的時間戳。 當您接受另一個(或更確切地說,每個 )表單提交時,檢查存儲在$ _SESSION中的 值是否比舊版本 舊10秒鐘。如果是,請繼續。 如果不是,請不要再做任何工作。

你可以做到只有一些 數據庫的東西,我猜,但 $ _SESSION更簡單。

客戶端:當提交表單時,禁用Javascript提交按鈕。

+0

注意:即使該按鈕被禁用,當使用後退和前進按鈕或按F5鍵時,仍可能無意中再次提交相同的數據。通常會顯示警告,但很多人可能不會閱讀或理解這些警告。 – 2010-03-30 19:34:42

+0

我每10秒左右如何提交提交內容? 我可以做的JavaScript一旦禁用提交按鈕。 – ggfan 2010-03-30 19:34:46

6

創建一個唯一約束:

CREATE UNIQUE INDEX name_of_youw_index ON tablename(columnname); 

的INSERT現在將失敗,雙數據。

+0

我的表格被命名爲accounts。我應該只在帳戶表中使我的user_id(一個字段)唯一嗎? 所以這是正確的? CREATE UNIQUE INDEX user_id ON accounts(user_id); – ggfan 2010-03-30 19:33:56

+0

@ggfan:不是user_id您的自動增量列嗎? – ryeguy 2010-03-30 19:41:17

+0

是的。 我沒有完美地說出我的問題。我希望用戶無法通過刷新頁面意外兩次提交數據等,他們被允許再次提交相同的數據。 – ggfan 2010-03-30 19:56:12

0

在數據庫重複的情況下,在該字段上添加一個唯一約束。

對於數據庫副本和重複的註釋,在按下後禁用提交按鈕2-3秒以防止多次提交。

1

通過爲其添加唯一索引,使數據庫中的電子郵件字段「唯一」。

如果你的數據庫中獲取與已經使用那麼MySQL將拋出一個錯誤的電子郵件另一個項目 - 錯誤編號爲1062

如果你想,那麼你可以處理此錯誤與別人不同。

mysql_errno()

http://www.php.net/manual/en/function.mysql-errno.php

-1

不要建立自己的帳戶創建/認證機制。這已經完成了10000次。使用另一個已經測試過的並且沒有缺陷的預先存在的。這樣做的唯一原因是經驗/理解登錄系統的生產實現如何演變。而且,真的,你想成爲一名專家嗎?還是你更願意專注於你正在研究的問題的領域?