php收藏功能实现
数据库设计
创建一个用于存储收藏信息的表,通常包含用户ID、收藏内容ID和收藏时间等字段。以下是一个简单的MySQL表结构示例:
CREATE TABLE `favorites` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`item_id` int(11) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `user_item` (`user_id`,`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
收藏功能实现
在PHP中实现收藏功能需要处理用户请求并更新数据库。以下是核心代码示例:
// 连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 处理收藏请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['item_id'])) {
$userId = $_SESSION['user_id']; // 从会话获取用户ID
$itemId = (int)$_POST['item_id'];
// 检查是否已收藏
$stmt = $pdo->prepare("SELECT id FROM favorites WHERE user_id = ? AND item_id = ?");
$stmt->execute([$userId, $itemId]);
if ($stmt->rowCount() > 0) {
// 取消收藏
$pdo->prepare("DELETE FROM favorites WHERE user_id = ? AND item_id = ?")
->execute([$userId, $itemId]);
echo json_encode(['status' => 'removed']);
} else {
// 添加收藏
$pdo->prepare("INSERT INTO favorites (user_id, item_id) VALUES (?, ?)")
->execute([$userId, $itemId]);
echo json_encode(['status' => 'added']);
}
exit;
}
前端交互
使用AJAX实现无刷新收藏功能:
document.querySelectorAll('.favorite-btn').forEach(btn => {
btn.addEventListener('click', function() {
const itemId = this.dataset.itemId;
fetch('/favorite.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `item_id=${itemId}`
})
.then(response => response.json())
.then(data => {
if (data.status === 'added') {
this.classList.add('active');
} else {
this.classList.remove('active');
}
});
});
});
安全性考虑
实现收藏功能时需要考虑以下安全措施:
- 验证用户登录状态
- 对输入参数进行过滤和类型转换
- 使用预处理语句防止SQL注入
- 实现CSRF保护
性能优化
对于高流量网站可以考虑:
- 添加缓存层减少数据库查询
- 使用批量操作处理大量数据
- 为常用查询字段建立合适索引
以上实现方案可以根据具体需求进行调整和扩展,例如添加收藏分类、收藏备注等功能。







