我正在为我的网站(一个定制的博客)设计一个标记系统。这些是我的源代码
<b>Please enter your tags, separating each one with a comma.<b><br>
<input type="text" name="tags" size=50>
$taginput = $_POST["tags"];
$tagarray = explode(",",$taginput);
for($i=0;$i<count($tagarray);$i++){
$usetag = mysql_real_escape_string(stripslashes(ltrim(rtrim($tagarray[$i]))));
if($usetag == "") continue;
$query = "INSERT INTO tags (item_id,tag) VALUES ($itemid,'$usetag')";
mysql_query($query);
}
CREATE TABLE `tags` (
`uid` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`item_id` INT( 11 ) NOT NULL,
`tag` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ;
其中item_id
是博客文章id,tag
是标签名称
现在我正在寻找一个解决方案,如果我用标签更新帖子。。如何删除现有标签并用新标签替换?如何删除一些特定的当前标签并用新标签替换?
像这样,
标签:衬衫,服装,到货被标签取代:t恤,旧的,出售
和
标签:衬衫,服装,到货到标签:衬衫,旧的,到货
如果可能的话,我还想防止用重复的标签名称过度填充tags tables
。请帮忙。。
您可以在表中添加一个名为modifiedOn
的新列。然后,每当在该表中插入或更新一行时,请将modifiedOn
列设置为当前时间。
这将允许您使用INSERT ... ON DUPLICATE KEY UPDATE ...
,然后在插入所有新标签后,只需删除在插入查询中使用之前修改的给定项目ID的标签。您可能还应该在事务内部执行此操作。
为了防止重复的标签,您需要为多对多关系提供另一个表
create table `items_tags` (
`item_id` int(10) unsigned not null default 0,
`tag_id` int(10) unsigned not null default 0,
primary key (`post_id`, `tag_id`),
)
create table `tags` (
`id` int(10) unsigned not null auto_increment,
`tag` varchar(100) not null default '',
primary key (`id`),
unique key (`tag`)
)
ps-无符号int的长度只有10个字符,而不是11个字符。
我不会为你键入所有的代码,但当表单提交时,你可以在标签表上"插入IGNORE",选择id的where tag IN(),从items_tags中删除item_id=,最后在items_tag中插入每个标签id的记录和当前项目id。
我建议你开始学习pdo。它让事情变得容易多了。您还应该具有在删除时级联的外键约束,这样当删除项或标记时,它在items_tags表中的引用也会被删除。
检索帖子的所有标签很简单:
select i.*, t.* from items as i left join items_tags as it on (it.item_id = i.id) left join tags as t on (it.tag_id = t.id) where i.id = <current item id>
希望能有所帮助。
您可以只使用
DELETE FROM `tags` WHERE `item_id` = $itemid;
在运行循环之前。
注意:我会考虑转义(至少)或切换到存储过程(最好的情况),以保护您的应用程序免受SQL注入的风险。