Php 在MySQL数据库中存储复选框值的最佳方法是什么?

Php 在MySQL数据库中存储复选框值的最佳方法是什么?,php,mysql,Php,Mysql,首先,以本页为例: 如果您查看“便利设施”部分,租金中包含3组复选框:单元功能、社区功能和公用设施 我的问题是:如何使用PHP生成3个数组变量,例如$unit\u features、$community\u features和$utilities\u,以存储哪些框被/未被签入表中的3个相应字段 更重要的是:如何以相同的数组格式从表中提取数据,以便查看/编辑/删除细节 注意,我已经无数次尝试通过在表中使用单独的字段作为tinyints来实现这一点,但它变得笨重,一点也不优雅……我甚至想过创建一个对

首先,以本页为例:

如果您查看“便利设施”部分,租金中包含3组复选框:单元功能、社区功能和公用设施

我的问题是:如何使用PHP生成3个数组变量,例如$unit\u features、$community\u features和$utilities\u,以存储哪些框被/未被签入表中的3个相应字段

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

注意,我已经无数次尝试通过在表中使用单独的字段作为tinyints来实现这一点,但它变得笨重,一点也不优雅……我甚至想过创建一个对象类,但又一次失败了。。
物业和便利设施之间存在多对多关系。要对此建模,您需要一个单独的表,而不是可变的列数

有一个表存储您的属性

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);
当您想知道某个特定属性有哪些便利设施时,只需从该表中选择该属性键的所有行即可。当您要打印所有便利设施的复选框时,请从便利设施表中选择,并与property_便利设施表进行左外连接。属性表中具有空值的行是未选中的框


。在关系数据库停业之前,您应该从您当地的边界上拿起一本关于关系数据库的书:

如果它们不是相互排斥的;您可以使用位运算符来存储它们

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);
}
然后将字段存储为无符号整数。这允许您查询例如

select * from <table> where field&(1<<0);
或社区特色:

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

1 php序列化和取消序列化 将帮助您在db中保留数组、对象或任何其他结构数据

2对输入名称使用数组格式,如下所述:

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


因此,重新使用-您可以通过这种方式发送数组,所有复选框1或0都有错误,并将它们作为序列化对象存储在三个字段中。

我将其保存为数据库中的JSON,但这不是php标准:pIgnore注释。这是一个非常糟糕的建议。问题中的链接断开,更新或删除谁会对我进行攻击,请提供我被攻击的原因的信息?可能是因为没有提到关系或只是使用多个列;-我有一个+1的平衡,但它可以是一个更全面的答案。通常情况下,像这样的咀嚼是作为一个过早的优化,而不是一个深思熟虑的决定。我不是说这种方法不好;事实上,我在一些非常特殊的情况下使用了它,在这种情况下,数据的编码——很好的一点可以归结为使用的实际语义。在任何情况下,这仍然没有真正解决多少容易一点。你看了他的网页吗?这里没有3个复选框,而是31个复选框,考虑到应用程序,这可能会改变。当人们搜索财产时,他还想对这些单独的复选框进行常规查询。没有理由尝试像这样将正常关系打包到整数字段中。你的建议很差,所以被否决了。@Dan Grossman,这需要更多关于数据模型的知识,而不是问题所提供的知识。。。但通常是正确的。为什么建议将基本关系作为序列化的PHP数组存储在一列中,使单个关系不可查询、不可更新和不可删除?数据库规范化101要求字段应该是单值的。这个数据库并不是一个特例,它提供了忽略这些规范的理由。你是对的,应该创建一个新表,就像你发布的一样。我的建议很好,但前提是这些checbox不用于sql查询,而不是将整个字段转换为php。序列化数据肯定是要避免的。。。当实际使用这些数据时,这真是一场噩梦。谢谢Dan,我确实需要提高我对数据结构的理解&规范化dbs-我一直在寻找速记修复,但我想这只是为了避免真正的问题。我对数据结构知之甚少Dan-我对JOIN语句感到困惑。我读了一些关于JOIN和OUTER JOIN语句的书,不知道如何在这里应用它们。您是否可以提供一个示例Sql语句,用于打印出某个酒店的已签出/未签出的便利设施?选择便利设施。*,从便利设施左侧选择property\u commercies.property\u id连接便利设施上的property\u commercies.id=property\u commercies.amency\u id,其中property\u commercies.property\u id=7。带有属性_id值的行是选中的
框中,属性_id为NULL的行是未选中的框。@DanGrossman我知道这很旧,但我必须将查询中的WHERE改为AND才能返回NULL值