php实现收藏
实现收藏功能的方法
在PHP中实现收藏功能通常涉及数据库操作、用户认证和前端交互。以下是实现收藏功能的详细步骤:
数据库设计
创建两个表:users(用户表)和favorites(收藏表)。用户表存储用户信息,收藏表存储用户收藏的内容。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL
);
CREATE TABLE favorites (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
item_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
用户认证
确保用户已登录才能执行收藏操作。可以使用PHP的Session机制实现用户认证。
session_start();
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit();
}
收藏操作
在页面中添加收藏按钮,并通过AJAX或表单提交实现收藏功能。
<button id="favorite-btn" data-item-id="123">收藏</button>
<script>
document.getElementById('favorite-btn').addEventListener('click', function() {
const itemId = this.getAttribute('data-item-id');
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.success) {
alert('收藏成功');
} else {
alert('收藏失败');
}
});
});
</script>
后端处理
创建favorite.php文件处理收藏请求。
session_start();
if (!isset($_SESSION['user_id'])) {
echo json_encode(['success' => false, 'message' => '未登录']);
exit();
}
$itemId = $_POST['item_id'] ?? 0;
$userId = $_SESSION['user_id'];
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');
// 检查是否已收藏
$stmt = $db->prepare("SELECT * FROM favorites WHERE user_id = ? AND item_id = ?");
$stmt->execute([$userId, $itemId]);
if ($stmt->fetch()) {
echo json_encode(['success' => false, 'message' => '已收藏']);
exit();
}
// 添加收藏
$stmt = $db->prepare("INSERT INTO favorites (user_id, item_id) VALUES (?, ?)");
if ($stmt->execute([$userId, $itemId])) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '收藏失败']);
}
取消收藏
实现取消收藏功能,与收藏类似,但执行删除操作。
$stmt = $db->prepare("DELETE FROM favorites WHERE user_id = ? AND item_id = ?");
if ($stmt->execute([$userId, $itemId])) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '取消收藏失败']);
}
显示收藏列表
查询用户的收藏列表并显示。
$stmt = $db->prepare("SELECT item_id FROM favorites WHERE user_id = ?");
$stmt->execute([$userId]);
$favorites = $stmt->fetchAll(PDO::FETCH_COLUMN);
foreach ($favorites as $itemId) {
echo "收藏项ID: " . htmlspecialchars($itemId) . "<br>";
}
安全性考虑
确保所有用户输入都经过验证和过滤,防止SQL注入和其他安全漏洞。
$itemId = filter_input(INPUT_POST, 'item_id', FILTER_VALIDATE_INT);
if ($itemId === false || $itemId === null) {
echo json_encode(['success' => false, 'message' => '无效的收藏项']);
exit();
}
性能优化
为频繁查询的字段添加索引,提高查询效率。
CREATE INDEX idx_user_item ON favorites (user_id, item_id);
通过以上步骤,可以实现一个完整的收藏功能,包括添加、取消和显示收藏列表。







