当前位置:首页 > 原创作品 > emlog修改标签有可能会造成重复标签的bug以及修复

emlog修改标签有可能会造成重复标签的bug以及修复

作者:星之宇 ┊ 时间:2013-5-2 12:13 ┊ 分类: 原创作品 ┊ 阅读:11848 ┊ 评论:2
这个应该算是不是bug的bug,是设计上的问题。

tag标签,这个很多人用到的吧。后台直接点击标签会跳到修改标签名称的界面,好了问题来了。

假如我有n多的标签,其中有2个标签,一个是“blog”,另一个是“博客”,可能由于我心血来潮(^_^),看到“博客”标签想修改为“blog”,当然由于标签太多我可能不会注意到已经有了“blog”,直接进行修改了。修改后问题来了,首先你可以看到2个“blog”标签,然后就是新写的文章如果手动添加“blog”的标签,那么会同时把文章ID写入数据库中标签名称为“blog”的标签中,这个时候查看日志会有2个“blog”的标签。

点击查看原图


其实这个你可以自己修改的,在tag_model.php中(include/model文件夹中):

1、查找“updateTagName”,找到updateTagName函数,这个主要是控制修改标签名字后,更新数据库的。这里面根本没有判断tagname和数据库中的tagname有没有重名。

	function updateTagName($tagId, $tagName) {
		$sql="UPDATE ".DB_PREFIX."tag SET tagname='$tagName' WHERE tid=$tagId";
		$this->db->query($sql);
	}

2、判断标签名字有没有重复,没有重复修改名字,重复合并标签。

	function updateTagName($tagId, $tagName) {
			$result = $this->db->once_fetch_array("SELECT gid FROM ".DB_PREFIX."tag WHERE tagname='$tagName'");//找修改的标签名字和数据库中有没有重复
			if (empty($result)) {
				$sql="UPDATE ".DB_PREFIX."tag SET tagname='$tagName' WHERE tid=$tagId";//没有重复直接修改名字。
				$this->db->query($sql);
			}else {
				$row = $this->db->once_fetch_array("SELECT gid FROM ".DB_PREFIX."tag WHERE tid='$tagId'");//有重复查找要修改的标签包含的文章
				$taggid = trim($result['gid'], ",").','.trim($row['gid'], ",");//连接所有的文章ID
				$taggid= implode(',',array_unique(explode(',', $taggid)));//去掉重复文章ID
				$query="UPDATE ".DB_PREFIX."tag SET gid=',".$taggid.",' WHERE tagname='$tagName'";//文章ID写入已有标签的数据库
				$this->db->query($query);
				$this->db->query("DELETE FROM ".DB_PREFIX."tag where tid=$tagId");//删掉修改ID的标签(这个时候数据已经放入重复名称的那个标签中了)
			}
	}

目前有 2 条评论
avatar
GW 2013-05-05 20:11回复2楼
EM的这部分源码搞得不太好,只能改程序……
avatar
网上兼职 2013-05-05 15:10回复1楼
支持下博主!