2011-09-07 25 views
1

想想我正在从事的一种调查形式。它有50多种可能的条件可以全部检查 - 或者一个。就像任何形式一样,我需要能够将结果发布到MySQL数据库。我试图找出最好的方法来获得所有这些复选框的输入,而不必为每个复选框创建单独的列(除非这被认为是最佳实践)。从网络表单上的50多个复选框获取输入

所以这里是我的想法可以工作。从1-N数字分配复选框名称。然后遍历每个复选框,检查它的状态。然后,不要为每个复选框创建一列 - 使用一列并将每种复选框的某种标识符连接起来。

伪码

For checkbox in N: 
    check state of N: 
     if N is checked: 
      concatenated string += idenifier(N) 

是这种方法做的一个很好的方式,或者你有其他的建议?

回答

0

在数据库中使用单独的列应该取决于信息的内容以及您计划在将来如何使用它。

如果您要收集的信息是唯一的,可以单独使用......也就是说,如果每个checkbox表示可以编译并与其他人分开使用的值,那么我将使用单独的列。

编辑

按您的评论...

会是什么这种方法的好处,如果我可以,只要让所有从连接字符串相同 信息我获取数据时有额外的解析步骤吗?

我能想到的几个原因:

  1. 你可能不知道你是怎么想找回在未来的信息。把它放在一个领域将会使得它变得更加困难,这取决于你想如何抓住它。

  2. 比较信息变得更加困难,如果你想这样做。

  3. 添加或删除checkboxes也将变得更难以维护。

+0

如果我可以从连接字符串中获取所有相同的信息,只要我在获取数据时有额外的解析步骤,该方法的好处是什么? – chancelkx

+0

看到我上面的编辑@ chancelkx –

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); 
} 

,并建立不同的问卷....自定义数据搜集....和更多

+0

所以一个表单提交将有一行是每个列是一个复选框和chexbox的状态? – chancelkx

+0

此外,为什么我的方法是最糟糕的方式? – chancelkx

+0

不,他说一次提交会有很多行,每行都会描述一个复选框的状态。 – Nathan

0

我的建议是在MySQL表中创建一个字段varchar(50)。根据相关复选框是否被选中,每个位置将为0或1。因此,如果用户选中箱1,2,5,10,50,你的字符串看起来像:

$string = "1100100001000...0001" <- 50 positions 

你可以在接收代码创建迭代,以检查是否复选框被选中或不。如果选中,则向字符串添加“1”,如果未选中,则添加“0”。

您甚至可以在客户端的JavaScript代码中使用JavaScript创建字符串,并传递已准备好存储的字符串。

我已经看到类似的实现用于跟踪分期付款计划中的付款 - 字符串中的每个位置代表每月付款。

我希望这会有所帮助。

+0

这正是我所设想的。所有它需要的是一个查找表,它可以像一个xml文件一样简单,所有的值都以相同的顺序。如果项目1,3,5在表中被检查读取项目1,3,5。我不明白为什么这被认为是不好的。 – chancelkx

+2

@chancelkx:由于多种原因,这很糟糕。 a)映射与数据是分开的,这意味着如果更改复选框集,则必须同时更改映射和数据,并保持它们同步,因为没有映射,数据没有意义; b)它没有被标准化,所以你不能利用关系数据库的任何能力,即没有索引,没有快速搜索; – dnagirl

+0

@dnagirl这是有道理的。谢谢。 – chancelkx

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); 
0

也许,最干净的方法来这样做,它的保存形式的结果ORM对象,所以复选框会像一个表单结果的属性访问。

你可以使用Doctrine或MongoDB。

相关问题