php实现标签功能
PHP 实现标签功能的方法
数据库设计
创建标签表(tags)和文章标签关联表(article_tags),结构如下:
CREATE TABLE `tags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`slug` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
);
CREATE TABLE `article_tags` (
`article_id` int(11) NOT NULL,
`tag_id` int(11) NOT NULL,
PRIMARY KEY (`article_id`,`tag_id`)
);
添加标签功能
处理表单提交时,将标签字符串转换为数组并存储:
function addTagsToArticle($articleId, $tagString) {
$tags = explode(',', $tagString);
foreach ($tags as $tagName) {
$tagName = trim($tagName);
$tag = getTagByName($tagName);
if (!$tag) {
$tagId = createTag($tagName);
} else {
$tagId = $tag['id'];
}
linkTagToArticle($articleId, $tagId);
}
}
标签查询功能
获取文章的所有标签:

function getArticleTags($articleId) {
$query = "SELECT t.* FROM tags t
JOIN article_tags at ON t.id = at.tag_id
WHERE at.article_id = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$articleId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
标签云实现
生成按使用频率排序的标签云:
function getTagCloud($limit = 50) {
$query = "SELECT t.*, COUNT(at.tag_id) as count
FROM tags t
LEFT JOIN article_tags at ON t.id = at.tag_id
GROUP BY t.id
ORDER BY count DESC
LIMIT ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$limit]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
前端显示
在文章页面显示标签:

$tags = getArticleTags($articleId);
foreach ($tags as $tag) {
echo '<a href="/tag/'.$tag['slug'].'">'.$tag['name'].'</a>';
}
标签页面
显示包含特定标签的所有文章:
function getArticlesByTag($tagId) {
$query = "SELECT a.* FROM articles a
JOIN article_tags at ON a.id = at.article_id
WHERE at.tag_id = ?
ORDER BY a.created_at DESC";
$stmt = $pdo->prepare($query);
$stmt->execute([$tagId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
性能优化
为频繁查询的字段添加索引:
ALTER TABLE `tags` ADD INDEX `slug_index` (`slug`);
ALTER TABLE `article_tags` ADD INDEX `tag_id_index` (`tag_id`);
缓存策略
对标签云和热门标签使用缓存:
function getCachedTagCloud() {
$cacheKey = 'tag_cloud';
if ($cache->has($cacheKey)) {
return $cache->get($cacheKey);
}
$tagCloud = getTagCloud();
$cache->set($cacheKey, $tagCloud, 3600);
return $tagCloud;
}






