当前位置:首页 > PHP

php 收藏功能实现

2026-02-15 21:21:57PHP

数据库设计

需要创建两张表:articles(文章表)和favorites(收藏表)。articles表存储文章信息,favorites表记录用户收藏行为。

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL
);

CREATE TABLE favorites (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    article_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (article_id) REFERENCES articles(id)
);

收藏功能实现

在PHP中实现收藏功能需要处理用户请求,检查是否已收藏,然后执行相应操作。

php 收藏功能实现

// 连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

// 处理收藏请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['article_id'], $_POST['user_id'])) {
    $articleId = $_POST['article_id'];
    $userId = $_POST['user_id'];

    // 检查是否已收藏
    $stmt = $pdo->prepare("SELECT id FROM favorites WHERE user_id = ? AND article_id = ?");
    $stmt->execute([$userId, $articleId]);
    $isFavorited = $stmt->fetch();

    if ($isFavorited) {
        // 取消收藏
        $stmt = $pdo->prepare("DELETE FROM favorites WHERE user_id = ? AND article_id = ?");
        $stmt->execute([$userId, $articleId]);
        echo json_encode(['status' => 'unfavorited']);
    } else {
        // 添加收藏
        $stmt = $pdo->prepare("INSERT INTO favorites (user_id, article_id) VALUES (?, ?)");
        $stmt->execute([$userId, $articleId]);
        echo json_encode(['status' => 'favorited']);
    }
    exit;
}

前端交互

使用AJAX实现无刷新收藏功能,提升用户体验。

<button id="favorite-btn" data-article-id="1" data-user-id="1">收藏</button>

<script>
document.getElementById('favorite-btn').addEventListener('click', function() {
    const articleId = this.getAttribute('data-article-id');
    const userId = this.getAttribute('data-user-id');

    fetch('favorite.php', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: `article_id=${articleId}&user_id=${userId}`
    })
    .then(response => response.json())
    .then(data => {
        if (data.status === 'favorited') {
            this.textContent = '已收藏';
        } else {
            this.textContent = '收藏';
        }
    });
});
</script>

显示收藏状态

页面加载时检查当前用户是否已收藏该文章。

php 收藏功能实现

// 检查收藏状态
$stmt = $pdo->prepare("SELECT id FROM favorites WHERE user_id = ? AND article_id = ?");
$stmt->execute([$userId, $articleId]);
$isFavorited = $stmt->fetch();

// 输出按钮HTML
echo '<button id="favorite-btn" data-article-id="'.$articleId.'" data-user-id="'.$userId.'">';
echo $isFavorited ? '已收藏' : '收藏';
echo '</button>';

安全性考虑

实现收藏功能时需要注意防止SQL注入和CSRF攻击。

// 使用预处理语句防止SQL注入
$stmt = $pdo->prepare("INSERT INTO favorites (user_id, article_id) VALUES (?, ?)");
$stmt->execute([$userId, $articleId]);

// 添加CSRF令牌验证
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF token validation failed');
    }
}

性能优化

对于大量收藏数据,可以考虑添加索引和缓存。

-- 为favorites表添加复合索引
CREATE INDEX idx_user_article ON favorites(user_id, article_id);

-- 使用Redis缓存热门文章的收藏数
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->incr("article:$articleId:favorites");

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

相关文章

vue实现用户添加功能

vue实现用户添加功能

实现用户添加功能的步骤 表单设计与数据绑定 在Vue组件中设计一个表单,包含用户名、邮箱、密码等字段。使用v-model指令实现双向数据绑定,将表单输入与组件的数据属性关联起来。 <t…

vue实现收货功能

vue实现收货功能

实现收货功能的基本思路 在Vue中实现收货功能通常涉及前端界面交互、后端API调用以及状态管理。以下是关键步骤和代码示例: 页面布局与数据绑定 使用Vue的模板语法构建收货表单,包含收货人、联系方式…

php实现分享功能实现

php实现分享功能实现

实现PHP分享功能的方法 在PHP中实现分享功能可以通过多种方式完成,以下是一些常见的实现方法: 使用社交媒体分享按钮 社交媒体平台如Facebook、Twitter、LinkedIn等提供了现成…

vue分类功能实现

vue分类功能实现

Vue分类功能实现方法 使用v-for指令渲染分类列表 在Vue模板中使用v-for循环渲染分类数据,结合v-bind动态绑定分类ID或其他属性 <div v-for="category in…

vue实现监控功能

vue实现监控功能

Vue 实现监控功能的方法 在 Vue 中实现监控功能通常涉及数据变化监听、生命周期钩子、自定义指令或第三方库的集成。以下是几种常见实现方式: 数据监控 通过 Vue 的 watch 属性监听数据变…

vue添加功能实现

vue添加功能实现

Vue 功能实现方法 添加组件 在 Vue 项目中创建新组件,通常位于 components 目录下。使用单文件组件(SFC)格式,包含 <template>、<script>…