【问题标题】:php dynamic checkboxesphp动态复选框
【发布时间】:2009-10-13 13:15:23
【问题描述】:

目前我有一个表单可以提交带有文本字段的图像,例如 标题、描述和另一个为 imageID 自动递增的字段,另一个 实际文件的区域,称为 vfile 和 *** 另一部分 3 个复选框和一个文本字段。 一切正常,这就是它的作用。将数据提交到数据库,以便它可以将信息拉到网站上的页面。 我要更新的唯一部分是: 3 个复选框和文本字段。 假设第一个复选框显示:Apples 第二个:橙子 第三:葡萄 在另一个类别中是一个空白文本字段,如果您添加一些内容,它会将其添加到一个名为“其他”的类别中。

所以数据库设计有 4 个字段:1 - 苹果,2 - 橙子,3 - 葡萄,4 - 其他。

当我点击一个复选框时,它会在数据库中添加正确的复选框,无论是苹果、橙子还是葡萄。 如果我在文本框中添加一个字段,例如:Bannanas,那么它会将“Bannanas”添加到数据库字段 vother 并在数据库中显示。

这一切都很好,但是如果下一张图片包含所有 4 个项目,再加上另一个呢?比如下一张图片有苹果、橙子、葡萄、香蕉和李子?

我如何将“Bannanas”其他类别更改为复选框类别,下次我进入添加图像页面时可以为下一张照片选择该类别。 所以当我去第二张图片提交时,它会给我的选项不仅仅是 3 个复选框,而是现在 4 个复选框,我可以选中前 4 个,“Apples, Oranges, Grapes, Banannas”,然后放 Plums在其他类别中。

基本上,在提交时,它会获取其他字段中的内容并向数据库添加一个新类别,然后将其显示在复选框选项数组中,现在它从其他类别中删除,因为它是一个复选框。 (因此它不希望将值留在旧字段中,因为它会继续创建相同的类别并可能重写旧数据。

无论如何,有什么建议吗? 提前致谢。

【问题讨论】:

  • 听起来你知道你需要做什么。你有什么问题?

标签: php sql


【解决方案1】:

(听起来这更像是一个数据库设计问题,而不是一个 php 问题,但我可能误解了你在寻找什么建议)

听起来您是在说这些属性(Apples、Orange 等)作为列存储在您的主表中;但是您描述的情况听起来更像是标记。通常,您会维护一个被标记的事物列表(您的图像),以及所有可能标记的单独列表(这将是一个包含行的表:Apple、Orange、Grape)。您的 UI 可以选择从预先存在的标签(标签表中的行)或使用“其他”框添加新标签。新标签将作为新行添加到标签表中。由于标签和标记项目具有多对多关系,您将创建第三个表(称为连接表),用于存储标记项目的键和标签的键;这样您就可以轻松地选择关系的任何一方:获取给定项目的所有标签;获取具有给定标签的所有项目。

这有帮助吗?

(编辑:对于 cmets)

所以,Activity 听起来像是标签列表。如果我想为所有活动显示一个带有复选框的表单,我可以为它们查询活动表。这些复选框中的每一个都可以有一个 name 属性或捕获其绑定到的行的 ID 的东西。

我还会从连接表中选择我当前查看的图像已选择的标签的 ID。当我填充复选框列表时,我可以检查此结果集以查看我放置在页面上的复选框的 id 是否在图像的标签列表中。

要在提交时将其存储回数据库,最简单的方法可能是(在事务中)从连接表中删除图像的所有条目,并根据复选框的状态将它们替换为新条目表格。

【讨论】:

  • 首先,感谢大家的帮助——这是我第一次在@SO 提问。我通常向专家交流提问,但无论如何。无论如何,这个问题是给我的一个朋友的,我知道他最初设计他的桌子的方式没有标准化,并且添加其他任何可能的东西:盒子不会按照它的设计方式发生,所以我创建了一个新的表,tb活动。因此,向该 Other: 框添加一些内容并提交表单确实会将您在该文本框中的任何内容添加到 tbActivities 表中 - 这是有效的。另一个评论来了-->
  • 我想知道的是如何在稍后更新 sql 中引用这些复选框中的每一个,以便如果选中了一个复选框但后来他不想选中它,我该如何输入例如,将最初检查草莓的内容放入 sql 中,如果现在他想要取消选中,因为 tbActivities 正在通过一个 while 循环进行拉取,这些复选框中的每一个都没有真实名称。确实如此,但我不知道如何引用它,因为它正在获取 tbActivities 中的当前行,将其附加到 INPUT 中的“chk-”,就是这样。
  • 但是由于它是动态的,我怎么知道在 UPDATE 代码中放什么来改变它?这也适用于从 tbActivities 中提取的所有复选框。感谢您的帮助 - 这个问题让我陷入困境。
【解决方案2】:

放下苹果、橙子和葡萄柱。

创建第二个表,其中包含两个字段:imageID 和 itemtype。 不要使两者中的任何一个成为关键。现在,您可以根据需要为每个图像列出尽可能多的不同类型的项目。从数据库中获取正在使用的项目类型列表会相对昂贵,但除非您拥有数百万个项目,否则这应该不是问题。 (Mikeb 建议将正在使用的项目类型列表保存在单独的表格中以加快速度。)

另一种方法是为您遇到的每种项目类型动态添加一列到第一个表中。这将创建一个非常稀疏的表。我不会这样做。

【讨论】:

    【解决方案3】:

    您需要更改数据库架构以支持无限数量的属性。

    您应该将属性列表从记录中的一组字段移动到新表中的相关记录列表中。这个新表需要 2 列。第一个是现有表的主键,因此您可以建立表之间的关系。第二个是属性字段(“香蕉”或“苹果”或“李子”等)。对于主表中的每条记录,您可以在属性表中拥有任意数量的记录。如果没有检查,您也可能没有属性记录。

    两个表之间的这种关系称为一对多关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多