想想我正在研究的一种调查形式。它有50多个可能的条件,可以全部检查 - 或一个。就像任何形式一样,我需要能够将结果发布到MySQL数据库。我试图找出从所有这些复选框获取输入的最佳方法,而不必为每个复选框创建单独的列(除非这被认为是最佳实践)。
所以这就是我的想法。从1-N以数字方式指定复选框名称。然后遍历每个复选框,检查它的状态。然后不是为每个复选框创建一个列 - 使用一列并为每个复选框连接某种标识符。
伪码
For checkbox in N:
check state of N:
if N is checked:
concatenated string += idenifier(N)
这种方法是一种很好的方法,还是有其他建议?
答案 0 :(得分:1)
这可能是最糟糕的做法。你提出的解决方案有很多问题 - 而不是试图从母猪的耳朵里制作一个丝绸钱包....
在关系数据库中执行此操作的唯一合理方法是将每个复选框结果存储在表中自己的行中。所以你可能有类似的东西:
response {
id auto_increment-,
user_id references data elsewhere,
...
primary key (id)
}
answers {
response_id references response.id,
checkbox_id references available_checkboxes.id,
value_selected,
primary key(response_id, check_box id)
}
然后您还可以描述复选框代表的内容:
available_checkboxes {
id auto_increment;
option_text varchar(40);
}
并制作不同的问卷....定制数据收集....等等
答案 1 :(得分:1)
您的问题不是关于您的表单,而是关于如何存储您的数据。听起来你想存储可能被认为是稀疏矩阵的东西,即你只想存储非空值。看看EAV model。它对于这样的数据很有用,虽然它确实有一些你应该自己意识到的主要限制。
表结构基本上将列放入行中。像这样:
CREATE TABLE terms(
term_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
termname varchar(30) NOT NULL,
termvalue varchar(100) NOT NULL,
assoc_id INT UNSIGNED NOT NULL,
CONSTRAINT FOREIGN KEY (assoc_id) REFERENCES maintable(main_id) ON DELETE CASCADE)
ENGINE=InnoDB
因此,无论您喜欢什么,都可以打电话给您的复选框。处理它们时,将有2个插入查询 - 一个用于创建主记录;和一个存储相关的复选框值。
INSERT INTO maintable(allfields, that, must, be, collected) VALUES (1,2,3,4,5);
//get last_insert_id(), we'll say main_id=7 this time
INSERT INTO mytable(termname, termvalue, assoc_id)
VALUES
('colour', 'blue', 7),
('feeling','happy', 7),
('schedule', 'daily', 7);
答案 2 :(得分:0)
在数据库中使用单独的列应根据信息是什么以及计划将来如何使用它来确定。
如果您正在收集唯一且可以单独使用的信息...也就是说,如果每个checkbox
代表一个可以编译的值,然后与其他值分开使用,那么我会使用单独的列。
修改强>
根据你的评论...
如果我可以得到所有相同的方法,这种方法的好处是什么 只要我有一个连接字符串中的信息 获取数据时需要额外的解析步骤吗?
我可以想到几个原因:
您可能不知道将来如何检索信息。将它放在一个区域会使得它变得更加困难,这取决于你想要如何抓住它。
如果您希望这样做,那么比较信息会变得更加困难。
添加或删除checkboxes
也会变得更难维护。
答案 3 :(得分:0)
我的建议是在MySQL表中创建一个字段varchar(50)。每个位置都是0或1,具体取决于是否选中了相关的复选框。因此,如果用户选中了方框1,2,5,10和50,则字符串将如下所示:
$string = "1100100001000...0001" <- 50 positions
您可以在接收代码中创建迭代,以检查复选框是否已选中。如果选中,则在字符串中添加“1”,如果未选中,则添加“0”。
您甚至可以使用javascript在客户端的验证代码中创建字符串,并传递已准备好存储的字符串。
我已经看到类似的实施用于跟踪分期付款计划中的付款 - 字符串中的每个位置代表每月付款。
我希望这会有所帮助。
答案 4 :(得分:0)
可能最干净的方法是将表单结果保存为ORM对象,因此可以像表单结果的属性一样访问复选框。
您可以使用Doctrine或MongoDB。