2009-10-13 85 views
1

目前我有一个表单提交图像的文本框,如 标题,描述和另一个字段,它们自动增加了imageID,另一个 区域用于实际文件,名为vfile,另一个部分 3个复选框和一个文本字段。 一切工作正常,这就是它的作用。将数据提交给数据库,以便它可以将信息提取到网站上的页面。 我试图更新的唯一部分是: 3个复选框和文本框。 可以说第一个复选框显示为:苹果 第二个:桔子 第三个:葡萄 而在另一个类别中是一个空白文本框,如果添加了一些内容,它会将其添加到名为“Other”的类别中。因此数据库设计有4个领域:1 - 苹果,2 - 桔子,3 - 葡萄,4 - 其他。php动态复选框

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

这很好,但如果下一张图片有全部4个项目,再加上另外一个呢?如果下一张照片有苹果,橘子,葡萄,Bannanas和李子?

我怎么能有“Bannanas”其他类别,更改为一个复选框类别,可以在下次添加图像页面时选择下一张图片。 因此,当我去第二张图片提交时,它会给我不仅仅是3个复选框,而是4个复选框的选项,我可以检查前4个“苹果,桔子,葡萄,Bannanas”,然后把其他类别的李子。

基本上在提交时需要什么是在其他feild中,并添加一个新的类别到数据库,然后显示在复选框选择数组中,它现在从其他类别中删除,因为它是一个复选框。 (因此不希望留在旧字段中的值,它会保持在创建相同的类别,并有可能改写旧数据。

不管怎样,任何建议吗? 在此先感谢。

+0

这听起来像你知道你需要做什么。你有什么问题? – 2009-10-13 13:21:25

回答

1

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

这听起来像你说的这些属性(苹果,橙子等)作为列存储在主表中;但是您所描述的情况听起来更像是标记(Tagging)。通常情况下,您需要维护一系列标记为(您的图像)的东西,以及单独的所有可能的标签列表(这将是一个包含行的表格:Apple,Orange,Grape)。您的用户界面可以选择预先存在的标签(标签表中的行)或使用“其他”框添加新标签。新标签将作为新行添加到标签表中。由于标记和标记项目具有多对多关系,因此您可以创建第三个表格(称为联接表格),用于存储标记项目和标记键的关键字;通过这种方式,您可以轻松选择关系的任何一方:获取给定项目的所有标签;使用给定的标签获取所有项目。

这有帮助吗?

(编辑:征求意见)

所以,活动听起来像标签列表。如果我想为所有活动显示带有复选框的表单,我可以为它们查询活动表。每个复选框都可以有一个名称属性,或者可以捕获绑定到的行的ID。

另外我想从连接表中选择,我目前看到的图像已经选择了标签的ID。当我填充复选框列表时,我可以检查这个结果集,看看我放在页面上的复选框的ID是否在图像的标签列表中。

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

+0

首先,感谢帮助的人 - 这是我第一次问一个问题@ SO。我通常会向专家提问 - 交换,但无论如何。 无论如何,这个问题是我的朋友,我知道他的方式最初设计自己的表是不是归一化和添加任何可能会在其他:箱子不会发生它的设计方式,所以我创建一个新表,tbActivities。因此,向其他人添加一些东西:填写并提交表单可以将您在该文本框中的任何内容添加到tbActivities表 - 这是行得通的。另一个评论来了 - > – JParsons4 2009-10-13 14:16:00

+0

我想知道的是我怎样才能引用每个这样的复选框,说,后来更新SQL,所以如果一个复选框被选中,但后来他希望没有检查,我怎么能说例如,如果现在他想要取消选中,那么因为tbActivities正在通过while循环,所以这些复选框中的每一个都没有真实名称。它的确如此,但我不知道如何引用它,因为它将tbActivities中的当前行添加到INPUT中的“chk-”中,就是这样。 – JParsons4 2009-10-13 14:25:07

+0

但是由于它是动态的,我怎么知道在UPDATE代码中放下什么来改变它呢?这也适用于所有从tbActivities中抽取的复选框。 感谢您的帮助 - 这个问题正在把我推上墙。 – JParsons4 2009-10-13 14:25:57

0

放下苹果,橘子和葡萄列。

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

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

0

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

你应该从一组字段中记录的新表将您的属性列表的相关记录列表。这个新表格需要2列。第一个是现有表中的主键,因此您可以建立表之间的关系。第二个是属性字段('Bananas'或'Apples'或'Plums'等)您可以在主表中为您的主表中的每条记录添加尽可能多的记录。如果没有任何检查,您也可以没有任何属性记录。

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