2010-08-05 59 views
5

我有一個非常大的窗體,包含單選按鈕/複選框以及文本輸入。由於複選框的性質,如果他們發佈表單而未檢查它,它不會在POST數據中發送。這讓我有點在如何處理它。當存在未知的數據量時,將表單數據放入數據庫的最佳方式是什麼?

我最初是用標準的「每個領域的專欄」開始我的數據庫。例如:

id | userid | firstname | lastname | middlename | phonenumber | mobilenumber | 

當我結束了30列以上時,這很快就改變了。這種形式是巨大的。我決定使用'EAV模式'給我的表只有4行。它現在看起來像這樣:

id | userid | name  | value 
---+--------+-----------+------ 
1 | 1 | firstname | steve 
---+--------+-----------+------ 
2 | 1 | lastname | blah 

這似乎是一個更好的方法。

所以我的問題是,當我不完全確定它發生了什麼時,我該如何處理數據庫?如果我有20個複選框(每個複選框都有自己的名字),我應該手動檢查是否提交了每個複選框,如果不是,則設置一個「空」值?

我應該從表中清空用戶ID的所有行並將其替換爲所有新數據嗎?

這樣做的有效方法是什麼?

回答

1

EAV在這種情況下是反模式。您將最終得出非常複雜的邏輯來檢索一組數據。

您的第一種方法對其他人更易於維護和理解。

當談到一個布爾值,如複選框的值,我會在數據庫中使用一個位/布爾字段,其中一個複選標記將是真實的,事實上,你沒有得到它張貼回來會成爲一個錯誤。

同樣的事情代表了EAV架構 - 將它們都保存在數據庫中,只需將值標記爲true或false,具體取決於發佈內容。

+0

我沒有太多的想法檢索數據。那不會很有趣...我不喜歡使用列而不是使用EAV的另一件事是某些表單元素可以被「添加更多」(一對多關係)。這意味着一個表格有多個表格。它只是看起來凌亂和低效......你仍然推薦這個解決方案? (可能應該早些提到一對多部分) – dave 2010-08-05 07:29:31

+0

@Steve - 這是關係數據庫擅長的相關數據。我會說,你需要幾張表格才能使用這種形式。從長遠來看,這將更容易處理。 – Oded 2010-08-05 07:37:44

+0

我想我會和許多專欄一起去。我非常喜歡只刪除所有行並從頭開始每個元素的想法。效率非常低,但我想,但更容易代碼xD – dave 2010-08-05 07:43:49

0

你應該首先解析你的輸入,並確定每個項目的正確值。然後你把這些數據存入數據庫。

代碼不應該依賴表單中字段的存在來決定放入數據庫的字段。表單可以很容易地被操縱,所以它可以用來改變表格中的任何字段,而不僅僅是與表單中的字段對應的字段。

如果您有大量類似的字段或動態字段集,則EAV模式很好。也許你應該將文本數據以常規方式存儲,並將複選框中的值存儲在單獨的表中。

0

也許有點偏離主題,但要解決的複選框功能,添加一個隱藏的輸入與複選框和前值相同的名字 - 零(或意味着「未設置」值):

<input type="hidden" name="blah" value="0"> 
<input type="checkbox" name="blah" value="1"> 

以這種方式,如果不選中該複選框,你仍然會得到0值在您的文章 - 但如果它被選中,您將得到1,因爲同一個名字的最後一個領域是POST「版。

相關問題