更新数据库中的标签值(它会重复)

时间:2016-12-10 14:49:06

标签: php mysql tags

我有这个表单,当我点击创建时,会将标签发送到我的数据库,并用逗号分隔 POST $query = "INSERT INTO data(tags) VALUES ('$tags')";

并在点击修改

时收到它们
GET
$query = "SELECT * FROM data WHERE id = $id";
$edit = mysqli_query($dbc, $query);
 while($row = mysqli_fetch_assoc($edit)){$tags = $row['tags'];}
POST
$tags = implode(",",$_POST['tags'];
$query = "UPDATE data SET tags= '$tags' WHERE id = $id";

这就是问题,当我点击更新按钮时,我发送了之前选定的标签和新选择的标签,并将它们添加到之前的标签上,以便了解我输入的内容:

  • 数据库标签:tag1,tag2
  • 表单编辑标签:[tag1] [tag2]
  • 表格新标签:[tag1] [tag2] [tag3] [tag4]
  • 数据库更新标签:tag1,tag2,tag1,tag2,tag3,tag4

    <form method="post" action=""> <select id="tags" name="tags[]" multiple="multiple"> <?php foreach ($tags as $tag) {echo "<option value'$tag' selected>$tag</option>";} ?> <option>tag1</option> <option>tag2</option> <option>tag3</option> <option>tag4</option> </select> <button type="submit" name="update">Submit</button> </form>

2 个答案:

答案 0 :(得分:1)

修复您的数据结构!

不要将标签存储为单个列中的多个值列表。您想要一个表,每个项目和每个标记都有一行:

create table ItemTags (
    ItemTagId int auto_increment primary key,
    ItemId int not null,
    Tag varchar(255) not null,
    constraint fk_ItemTags_ItemId foreign key (ItemId) references Items(Item)
);

然后,当您想要插入标记时,只需在此表中插入标记即可。

为什么在一个列中存储多个标签是一个坏主意?

  • 您无法(轻松)验证标记对于给定项目是否唯一。
  • 您不能(轻松)列出正在使用的所有标签。
  • MySQL的字符串操作功能很差。
  • MySQL无法(轻松)优化使用单个标记搜索项目的查询。

答案 1 :(得分:0)

您需要构建一个函数来检查标记1是否等于表单标记1.重复此文件在DB(foreach)中找到的所有标记。 然后,如果需要,使用更新功能即时更新。

更好的方法是使用Array $标记,并删除其中的所有重复项。

示例:

$ tagArrayUni = array_unique($ tag);