我有一个非常大的表单,包括单选按钮/复选框以及文本输入。由于复选框的性质,如果他们发布表单而不检查它,它不会在POST数据中发送。这使我对如何处理它感到困惑。
我最初使用每个字段的标准“列”启动了我的数据库。例如:
id | userid | firstname | lastname | middlename | phonenumber | mobilenumber |
当我最终拥有超过30列时,很快就改变了。这种形式是巨大的。我已经决定使用'EAV架构'给我的表只有4行。它现在看起来像这样:
id | userid | name | value
---+--------+-----------+------
1 | 1 | firstname | steve
---+--------+-----------+------
2 | 1 | lastname | blah
这似乎是一种更好的方法。
所以我的问题是,当我不完全确定它的内容时,我应该如何处理数据库?如果我有20个复选框(每个都有自己的名字),我应该手动检查每个复选框是否已提交,如果没有,则设置'null'值?
我应该从表中清空用户ID的所有行,并将其替换为所有新数据吗?
这样做的有效方法是什么?
答案 0 :(得分:1)
在这种情况下,EAV是一种反模式。为了检索一组数据,你最终会得到非常复杂的逻辑。
您的第一种方法对其他人来说更易于维护和理解。
当涉及一个布尔值,例如一个复选框值时,我会在数据库中使用一个位/布尔字段,其中一个复选标记是真的,而你没有得到它的事实将是变得虚伪。
同样的事情代表EAV架构 - 将它们全部保存在数据库中,只需将值标记为true或false,具体取决于发布的内容。
答案 1 :(得分:0)
您应首先解析输入,并确定每个项目的正确值。然后你获取数据并放入数据库。
代码不应该依赖于表单中字段的存在来确定要放入数据库的字段。表单可以很容易地被操作,因此它可以用来更改表格中的任何字段,而不仅仅是与表格中放置的字段相对应的字段。
如果您有大量类似字段或动态字段集,则EAV架构很好。也许您应该以常规方式存储文本数据,并将复选框中的值存储在单独的表中。
答案 2 :(得分:0)
也许有点偏离主题,但要解决复选框功能,请在复选框和值之前添加一个具有相同名称的隐藏输入 - 零(或表示“未设置”的值):
<input type="hidden" name="blah" value="0">
<input type="checkbox" name="blah" value="1">
这样,如果未选中该复选框,您的帖子中仍会显示0
的值 - 但如果选中该复选框,则会获得1
,因为最后一个同名字段为POST
'ed。