当前位置:首页 > PHP

php实现收藏功能

2026-03-13 05:53:45PHP

实现收藏功能的基本思路

收藏功能通常涉及用户与内容的交互,需要数据库存储用户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缓存:

php实现收藏功能

$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组件中设计一个表单,包含用户名、邮箱、密码等字段。使用v-model指令实现双向数据绑定,将表单输入与组件的数据属性关联起来。 <t…

vue实现粘贴功能

vue实现粘贴功能

实现粘贴功能的基本方法 在Vue中实现粘贴功能通常涉及监听paste事件,并处理剪贴板数据。以下是一个基础实现示例: <template> <div @paste="handl…

vue 分页功能实现

vue 分页功能实现

分页功能实现方法 使用 Element UI 的分页组件 Element UI 提供了现成的分页组件 el-pagination,可以快速实现分页功能。 安装 Element UI: npm in…

vue实现截图功能

vue实现截图功能

Vue实现截图功能的方法 使用html2canvas库 html2canvas是一个流行的JavaScript库,可以将HTML元素转换为Canvas,进而生成图片。在Vue项目中安装html2can…

vue图片实现功能

vue图片实现功能

图片上传功能实现 使用 <input type="file"> 结合 Vue 的 v-on:change 事件监听文件选择 <template> <input ty…

vue实现预览功能

vue实现预览功能

Vue 实现文件预览功能 使用 FileReader 实现本地文件预览 通过 HTML5 的 FileReader API 可以读取本地文件内容并显示预览。创建一个文件上传组件,监听 change…