在MySQL数据库中存储Checkbox值的最佳方法是什么?

时间:2011-07-22 00:47:38

标签: php mysql

首先,请看一下此页面的示例:Click here

如果您查看“设施”部分,则有3组复选框(单位功能,社区功能和租用的实用程序)。

我的问题是:我如何使用PHP制作3个数组变量(例如$ unit_features,$ community_features和$ utilities_included)来存储哪些框未被检入3个相应的字段表

更重要的是:如何以相同的数组格式从表中提取数据,以便查看/编辑/删除详细信息?

  • 注意,我已经尝试了无数次通过在表格中使用单独的字段(作为tinyints)来做到这一点 - 但它变得笨重而且根本不优雅......我甚至想过制作一个对象上课但又失败了..

3 个答案:

答案 0 :(得分:6)

您在属性和设施之间存在多对多的关系。要对此进行建模,您需要一个单独的表,而不是可变数量的列。

有一个表存储您的属性。

INSERT INTO property (id, address, square_footage...) VALUES (111, '123 Main St', 1234...)

有一张桌子可存放所有可能的设施。

INSERT INTO amenities (id, type, description) VALUES (222, 'Unit Features', 'Air Conditioning');

对于财产所拥有的每一个设施,在表中插入一行与这两个相关:

INSERT INTO property_amenitities (property_id, amenity_id) VALUES (111, 222);

当您想知道特定属性具有哪些便利设施时,只需SELECT此表中该属性密钥的所有行。当您要打印所有便利设施的复选框时,SELECT表格中的amenities并执行LEFT OUTER JOINproperty_amenities表格。 property_amenities表中具有空值的那些行是未选中的框。

Related reading。你应该在他们破产之前从你当地的BORDERS那里拿一本关于关系数据库的书:)

答案 1 :(得分:1)

如果它们不相互排斥;你可以使用按位运算符来存储它们。

field = 0;
if($unity_features_selected == true) {
  field |= (1<<0);
}
if($community_features_selected == true) {
  field |= (1<<1);
}
if($utilties_included_selected == true) {
  field |= (1<<2);
}

然后将字段存储为unsigned int。这使您可以查询(例如unity_features),例如

select * from <table> where field&(1<<0);

或社区功能:

select * from <table> where field&(1<<1);

答案 2 :(得分:-3)

1)php序列化和反序列化(http://php.net/manual/en/function.serialize.php )将帮助您在db中保留数组或对象或任何其他结构数据。

2)使用数组格式输入名称,如下所述:Submitting a multidimensional array via POST with php

3)请记住,根本不会发送未选中的复选框,因此请始终为每个复选框字段创建一个隐藏的输入字段。这将确保未经检查的checbox将被发送为false。以下是一个示例:Post the checkboxes that are unchecked

如此重新说明 - 你可以通过这种方式发送所有复选框(1或0),并将它们作为序列化对象存储在三个字段中。