php实现收藏功能
实现收藏功能的基本思路
收藏功能通常涉及用户与内容的交互,需要数据库存储用户ID和内容ID的关联关系。核心逻辑包括添加收藏、取消收藏、检查是否已收藏以及展示收藏列表。
数据库设计
创建收藏表favorites,至少包含以下字段:

CREATE TABLE favorites (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
content_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY (user_id, content_id)
);
UNIQUE KEY确保用户对同一内容只能收藏一次。
添加收藏功能
// 添加收藏
function addFavorite($userId, $contentId) {
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $pdo->prepare("INSERT IGNORE INTO favorites (user_id, content_id) VALUES (?, ?)");
$stmt->execute([$userId, $contentId]);
return $stmt->rowCount() > 0;
}
使用INSERT IGNORE避免重复收藏导致的错误。

取消收藏功能
// 取消收藏
function removeFavorite($userId, $contentId) {
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $pdo->prepare("DELETE FROM favorites WHERE user_id = ? AND content_id = ?");
$stmt->execute([$userId, $contentId]);
return $stmt->rowCount() > 0;
}
检查收藏状态
// 检查是否已收藏
function isFavorited($userId, $contentId) {
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $pdo->prepare("SELECT COUNT(*) FROM favorites WHERE user_id = ? AND content_id = ?");
$stmt->execute([$userId, $contentId]);
return $stmt->fetchColumn() > 0;
}
获取收藏列表
// 获取用户收藏列表
function getUserFavorites($userId) {
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $pdo->prepare("SELECT content_id FROM favorites WHERE user_id = ?");
$stmt->execute([$userId]);
return $stmt->fetchAll(PDO::FETCH_COLUMN);
}
前端交互示例
AJAX实现无刷新收藏:
$('.favorite-btn').click(function() {
const contentId = $(this).data('content-id');
$.post('/favorite.php', { action: 'toggle', content_id: contentId }, function(response) {
if (response.is_favorited) {
$(this).addClass('active');
} else {
$(this).removeClass('active');
}
});
});
完整控制器示例
// favorite.php
session_start();
if (!isset($_SESSION['user_id'])) die(json_encode(['error' => '未登录']));
$userId = $_SESSION['user_id'];
$contentId = $_POST['content_id'] ?? 0;
switch ($_POST['action'] ?? '') {
case 'add':
$success = addFavorite($userId, $contentId);
break;
case 'remove':
$success = removeFavorite($userId, $contentId);
break;
case 'toggle':
$isFavorited = isFavorited($userId, $contentId);
$success = $isFavorited ? removeFavorite($userId, $contentId) : addFavorite($userId, $contentId);
break;
default:
die(json_encode(['error' => '无效操作']));
}
echo json_encode([
'success' => $success,
'is_favorited' => isFavorited($userId, $contentId)
]);
性能优化建议
对于高频访问的收藏状态检查,可以使用Redis缓存:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = "user_favorite:$userId:$contentId";
// 检查缓存
if ($redis->exists($cacheKey)) {
return (bool)$redis->get($cacheKey);
}
// 数据库查询并缓存结果
$result = isFavorited($userId, $contentId);
$redis->set($cacheKey, (int)$result, 3600);
return $result;
安全注意事项
- 始终验证用户身份(通过会话或Token)
- 对
contentId进行类型验证和范围检查 - 使用预处理语句防止SQL注入
- 对频繁操作添加限流机制
以上实现可根据具体业务需求进行调整,例如添加收藏分类、收藏备注等功能。






