Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何构造MySQL数据库来存储多个复选框表单数据,然后在php中进行统计?_Php_Mysql_Checkbox - Fatal编程技术网

如何构造MySQL数据库来存储多个复选框表单数据,然后在php中进行统计?

如何构造MySQL数据库来存储多个复选框表单数据,然后在php中进行统计?,php,mysql,checkbox,Php,Mysql,Checkbox,我正在制作一个表格,用于存储我们在公司收到的查询主题信息 我使用php/MySQL存储单选按钮数据,例如: 雇员姓名 查询媒介电子邮件/电话/面对面 有了这样的单选按钮数据,我可以轻松地使用PHP查询数据库,例如统计每个员工通过电子邮件回答的查询数 我遇到的问题是关于查询主题的数据。这是带有许多不同复选框50+的复选框数据。我们希望能够不时地添加或删除复选框,尽管不是经常 我曾经将这些数据作为逗号分隔的值存储在数据库的单个单元格中,然后导出到excel以处理这些数据,但现在我想使用另一个PHP表

我正在制作一个表格,用于存储我们在公司收到的查询主题信息

我使用php/MySQL存储单选按钮数据,例如:

雇员姓名 查询媒介电子邮件/电话/面对面 有了这样的单选按钮数据,我可以轻松地使用PHP查询数据库,例如统计每个员工通过电子邮件回答的查询数

我遇到的问题是关于查询主题的数据。这是带有许多不同复选框50+的复选框数据。我们希望能够不时地添加或删除复选框,尽管不是经常

我曾经将这些数据作为逗号分隔的值存储在数据库的单个单元格中,然后导出到excel以处理这些数据,但现在我想使用另一个PHP表单来生成有关主题的统计信息

我的研究让我找到了两种可能的方法:

在我的数据库中为我的主题创建一个单独的表,每个可能的主题有一列,这样我的数据库中的列数就和表单中的复选框数一样多。 使用php函数serialize将复选框数据存储在数据库的一个单元格中,然后使用unserialize在php中处理数据。 我是一个绝对的初学者,所以对于这两个选项,我都不确定如何实际实现它:

使用此选项,我不确定我的MySQL列是否应仅为主题1、主题2等,或者它们是否应包含我的复选框值的名称,例如金钱、个人问题、实际问题等。我无法找到一个好的资源,了解如何以正确的方式存储复选框数据,当用户有时可能只点击了一个主题,而在其他情况下可能点击了10个主题。 使用此选项,我不确定如何使用唯一值填充下拉列表,以及以后如何跨数据库中的行计算唯一值的实例。 如果您能在这方面给我任何帮助,包括有关stackoverflow的教程链接或类似问题,我们将不胜感激。我还没有找到任何我能理解的关于这一点的东西,除了我认为选项1可能是正确的选择

编辑:在收到大卫关于如何做到这一点的想法后,我正在更新我的帖子,试图了解我将如何做到这一点


你所描述的可以被认为是一种多对多的关系。你有:

一种表格记录,可涉及多个主题 一个主题,可以与许多表单记录相关 在这种情况下,关系本身就是一个数据库记录。考虑这个表结构:

FormRecords
----------
ID
SomeTitle
UserIDWhoFilledOutForm
etc.

Themes
----------
ID
ThemeName
etc.

FormRecordThemes
----------
FormRecordID
ThemeID
每个主要实体都有一个标识符和关于该实体的信息。然后是一个链接表,其中包含关于这两个实体之间关系的信息

无论何时呈现表单,只需从主题中选择以填充复选框。您可以根据需要添加新的。您可能不应该删除它们,不过您可以通过在记录上设置一些标志来软删除它们,以指示不在表单上显示它们

如果您想要以任何重要的方式编辑主题,而这种方式可能会使该记录以前的使用无效,例如完全更改其名称/标题,那么请记住,您将修改其使用的整个历史记录。我不知道这在您的域中是否是一种风险,但在这种情况下,通过在关系表中存储当时的主题值,可能有助于稍微去规范化。比如,创建关系时主题的名称。如果可能,最好完全避免这种情况,主要是通过使关键主题值在域中保持不变


不要存储分隔列表,不要存储序列化数据,除非整个对象实际上是单个数据点。。。在数据库中将值分隔为它们自己的实际值。关系数据库非常擅长查询关系数据。

您可以将从用户获得的复选框的所有值放入一个CSV格式字符串中,并存储在一个单元格中。稍后,您可以拆分字符串并获取值

可以尝试将表单数据转换为JSON或序列化,然后保存到表中。非常感谢您提供的有用答案。我现在知道了与表单相关的数据库结构的正确方法。我将做一些进一步的研究,看看我是否能找到如何实际实现这一点。如果你知道一个很好的教程,关于一个与我非常相似的案例,否则我将很难将其付诸实践,请让我知道。@Morten:其实没什么,这些表和其他MySQL表一样。这不是一个如何实现的问题,而是一个你如何看待你的数据的问题。理想情况下,您希望以直观的现实生活术语定义实体,并定义关系
他们之间。任何时候你发现这样的关系,关系本身就可以成为一个实体。一个常见的例子是电影和演员。电影是一个实体,演员是一个实体。他们之间的任何两个关系也是一个实体,有一个字符名和一份薪水等。我现在在我的原始帖子中添加了3张图片,我试图解释这应该如何设置,但在实践中仍然不知道如何设置。如果你有时间的话,请你看一下这些图片,告诉我我的思路是否正确?@Morten:我不太清楚你在这些图片中代表了什么。虽然表2看起来很可疑。我希望一个主题有一个ID和一个名称。也许我不明白你的领域里的主题是什么?任何给定的主题真的是这5个值的组合吗?金钱,爱情,工作,学习,家庭我可以看出这是非常不清楚的:我在那里没有我的一张照片。这两幅带边框的图片试图解释我的1输入表单和相关联的MySQL查询2统计表单和相关联的MySQL查询。中间的图片是试图显示我的SQL数据库结构。您应该考虑这样的主题:我正在保存有关员工回答的查询的数据。在本例中,每个查询都有大量关联的主题1到5。我的目的是衡量我的员工收到最多询问的主题。