我有这个表单,当我点击创建时,会将标签发送到我的数据库,并用逗号分隔
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,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>
答案 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)
);
然后,当您想要插入标记时,只需在此表中插入标记即可。
为什么在一个列中存储多个标签是一个坏主意?
答案 1 :(得分:0)
您需要构建一个函数来检查标记1是否等于表单标记1.重复此文件在DB(foreach)中找到的所有标记。 然后,如果需要,使用更新功能即时更新。
更好的方法是使用Array $标记,并删除其中的所有重复项。
示例:
$ tagArrayUni = array_unique($ tag);