【问题标题】:Store dynamic form fields in database在数据库中存储动态表单字段
【发布时间】:2011-03-18 11:05:35
【问题描述】:

我已经阅读了关于这个(或至少接近这个)主题的其他答案,但我无法清楚地了解它,所以我再次寻求帮助。

我有一个复杂的动态 HTML 表单,我想使用 PHP 提交到数据库。该表单分为多个选项卡,在每个选项卡中我都有触发表单其他部分的复选框。示例:在我的表单中,我有一个复选框组,其中包含以下选项:“酒店”和“餐厅”。如果我检查酒店,我会显示表单的另一部分,专门针对“酒店”。 “餐厅”也是如此。所以这里非常动态,我不知道哪种方法是将每个表单字段存储在数据库中的最佳方法。因为它可能包含 15 个字段或 20 个字段,具体取决于选择。任何示例都将不胜感激,因为我在数据库设计方面并不那么先进。

谢谢!

【问题讨论】:

    标签: php database-design forms dynamic


    【解决方案1】:

    所以这里非常有活力,而我没有 知道哪个是最好的方法 用于存储每个表单域 数据库。

    如果我在这里误解了您,我深表歉意,但我认为您应该根据数据而不是表格来设计数据库。如果不知道您的具体情况,很难发表评论,所以这里有一个例子:

    如果您通常将表单中的所有数据转储到一个表中,但由于有时这将涉及提交 5 个值,而有时这将涉及提交 10 个值,因此您不确定您的表应该有多少列,那么我认为问题出在数据库设计中。

    找出哪些数据依赖于其他数据。例如,您提到检查“酒店”可能会打开更多特定于该选择的字段。假设这涉及“套房”、“床型”等内容。那么您应该有 3 个表、一个注册表(假设用户正在使用该表单购买这些服务)、一个酒店表和一个 registration_hotel 表。注册表将仅记录一些特定于注册的详细信息,例如客户的姓名和唯一的 ID 号。酒店表格将仅包含特定于酒店的信息,例如有多少间客房设有连接浴室。 registration_hotel 表将保存特定于该酒店注册的详细信息。您可能需要一个 bool 类型的列来记录用户是否请求“en-suite”。

    提交表单时,检查用户使用if(isset($_POST['hotel']) && !empty($_POST['hotel'])) 输入的部分。然后仅在条件为真时才将内容发送到 registration_hotel 表。

    如果这种设计导致对数据库进行过多的单独调用,您可能需要查看transactions,这将帮助您管理这些调用的速度和安全性。

    如果您可以发布一些您不知道该怎么做的具体示例,那将很有用。

    【讨论】:

    • 嗯,这就是您发布的确切情况。我相信它会以这种方式工作。我会创建多个表来存储每张表格。我将尝试将表单拆分为不同的部分,并在需要显示数据时将它们连接起来。感谢和抱歉,我的描述含糊不清。
    【解决方案2】:

    您没有指定如何管理此动态表单。你能编辑它的 PHP/HTML 源代码吗?如果您可以标记不同的变量,例如hotel[]restaurant[] 等,那将是一件很棒的事情。

    如果您提交的表单足够清晰(我的意思是语义结构正确),您可以存储整个提交的表单序列化。

    注意:此方法仅在您不需要在数据库中搜索特定项目时才有效。

    编辑:也许我误解了你的问题。

    您可以像这样创建'metadata' 表:

    form_id  |  option_name  | option_value
    ---------------------------------------
    1        |  hotel        | true
    1        |  restaurant   | false
    

    【讨论】:

    • 是的,就是这样。我必须在指定时间从数据库访问每个字段。字段不同,名称不同。问题在于,根据用户的选择,可能提交了 30 个或 15 个字段。
    • 没问题。这种类型的数据库设计,您可以在每个表单中存储任意数量的选项,甚至可以使用更多列来扩展它,例如提交者的 user_id、保存的时间戳等。甚至更多,如果您不需要存储这些数据,您可以修剪基于特定时间戳的“无趣”行。
    • 我关心的是如何设计数据库,以便我可以存储 15 个字段和 30 个字段。一次,用户可以在表单中进行选择,以便最终有 30 个字段,并且需要将它们提交到数据库。下次用户可以选择最终将 15 或 20 个字段存储在数据库中。所以数据库应该能够存储所有可能的或仅存储 5 或 10 个。希望您理解我的要求。
    • 我认为我的解决方案很容易做到这一点。
    猜你喜欢
    • 2011-01-31
    • 2014-05-14
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2011-03-10
    相关资源
    最近更新 更多