当前位置:首页 > PHP

php实现收藏功能

2026-03-13 05:53:45PHP

实现收藏功能的基本思路

收藏功能通常涉及用户与内容的交互,需要数据库存储用户ID和内容ID的关联关系。核心逻辑包括添加收藏、取消收藏、检查是否已收藏以及展示收藏列表。

数据库设计

创建收藏表favorites,至少包含以下字段:

php实现收藏功能

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避免重复收藏导致的错误。

php实现收藏功能

取消收藏功能

// 取消收藏
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;

安全注意事项

  1. 始终验证用户身份(通过会话或Token)
  2. contentId进行类型验证和范围检查
  3. 使用预处理语句防止SQL注入
  4. 对频繁操作添加限流机制

以上实现可根据具体业务需求进行调整,例如添加收藏分类、收藏备注等功能。

标签: 功能收藏
分享给朋友:

相关文章

前端vue登录功能实现

前端vue登录功能实现

登录功能实现步骤 在Vue中实现登录功能通常需要结合后端API,以下是关键步骤和代码示例: 创建登录表单组件 <template> <div> <form…

php实现分页功能

php实现分页功能

PHP实现分页功能的方法 数据库查询与分页逻辑 使用SQL的LIMIT和OFFSET实现分页。假设每页显示10条数据,当前页码为$page: $perPage = 10; $page = isset…

php实现评论功能

php实现评论功能

数据库设计 创建评论表(示例结构): CREATE TABLE `comments` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id`…

h5实现手机摇一摇功能

h5实现手机摇一摇功能

实现原理 手机摇一摇功能基于设备加速度传感器(DeviceMotionEvent),通过监听设备的加速度变化来判断用户是否进行了摇晃动作。HTML5提供了相关API获取设备传感器数据。 基本…

vue各种功能实现

vue各种功能实现

Vue 基础功能实现 数据绑定与响应式更新 使用 v-model 实现表单元素与数据的双向绑定,数据变更自动更新视图。 示例: <input v-model="message"> &…

vue 实现备注功能

vue 实现备注功能

Vue 实现备注功能的方法 数据绑定与基础表单 在 Vue 中实现备注功能,可以通过 v-model 实现双向数据绑定。创建一个文本输入框或文本域,绑定到组件的 data 属性: <templ…