你需要放慢一点;起初,您的问题似乎是关于动态生成 HTML 表单的 js/php 代码,但随后您开始谈论数据库字段。
您的问题对我来说仍然不是 100% 清楚,但是在您的情况下,我要做的是从数据库设计开始,而不是专注于其他任何事情。
我可以看到您正在考虑更改用户表。我认为这没有必要,也没有好的设计。
只要每个用户都有一个主键,即 users.id 字段,您就可以创建一个新表来存储表单字段数据,如下所示:
CREATE TABLE users_custom_form_data(
id INT NOT NULL,
FOREIGN KEY(id) REFERENCES (users.id) ON DELETE CASCADE,
/* then store any data you need to store about a form field */
field_type ENUM("text","number","phone","email","submit","etc"),
field_default_value VARCHAR(100) /* or what you think is necessary */,
field_name VARCHAR(100),
field_id VARCHAR(50),
field_class VARCHAR(50)
/* and any others you need */
) ENGINE = InnoDB;
由于我们将每条记录分配给一个 USER ID,我们稍后可以跟踪哪些用户拥有哪些自定义表单字段。
我希望这足以让你开始。
由于您澄清了您的问题,我认为我们现在正在查看的是一个表,其中包含一个用于拥有记录的用户 ID 的字段,一个用于自定义属性表 ID 的字段以引用其自定义字段。它看起来像这样:
CREATE TABLE tbl_user_attributes(
user_id INT NOT NULL,
FOREIGN KEY(user_id) REFERENCES(tbl_users.id) ON DELETE CASCADE,
attribute_id INT NOT NULL,
FOREIGN KEY(attribute_id) REFERENCES(tbl_attributes.id) ON DELETE CASCADE
) ENGINE=InnoDB;
然后属性 ID 将告诉您用户添加到其 CMS 的字段类型。属性表将由您预先填充并由您定义(使用您的默认字段)。它可能看起来像这样:
CREATE TABLE tbl_attributes(
id INT NOT NULL AUTO_INCREMENT,
text_label VARCHAR(100),
type ENUM("TextArea","CheckGroup","DropDown"),
data BLOB
) ENGINE=InnoDB;
因此,一旦您使用选项填充该表,用户应该能够添加任何类型的字段(在默认字段之上)并为其命名,即“电影”将存储在名为“text_label”的字段中它将属于“TextArea”类型。然后,该 tbl_attributes.id 将被插入到 tbl_user_attributes 中,其中包含创建它的用户的用户 ID。然后你的程序将通过读取数据库来完成剩下的工作。如果您想在其中存储用户数据,请将其存储在“数据”字段中(如果它始终是文本,您可以使用 TEXT 类型而不是 BLOB,但使用 BLOB 不是问题,因为您可以计算出您的需要处理由“类型”字段判断的数据,即TextArea 表示文本存储在BLOB 中。
希望这可以帮助。