开发标签系统-如何用新标签更新现有标签


Developing a Tagging System - How to update present tags with new ones?

我正在为我的网站(一个定制的博客)设计一个标记系统。这些是我的源代码

<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注入的风险。