当前位置:首页 > PHP

php 实现关注

2026-01-30 03:56:32PHP

实现用户关注功能的 PHP 代码示例

数据库设计 创建两张表:用户表(users)和关注关系表(follows)

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL
);

CREATE TABLE follows (
    follower_id INT NOT NULL,
    following_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (follower_id, following_id),
    FOREIGN KEY (follower_id) REFERENCES users(id),
    FOREIGN KEY (following_id) REFERENCES users(id)
);

关注操作

function followUser($followerId, $followingId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

    $stmt = $db->prepare("INSERT INTO follows (follower_id, following_id) VALUES (?, ?)");
    $stmt->execute([$followerId, $followingId]);

    return $stmt->rowCount() > 0;
}

取消关注操作

function unfollowUser($followerId, $followingId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

    $stmt = $db->prepare("DELETE FROM follows WHERE follower_id = ? AND following_id = ?");
    $stmt->execute([$followerId, $followingId]);

    return $stmt->rowCount() > 0;
}

检查关注状态

function isFollowing($followerId, $followingId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

    $stmt = $db->prepare("SELECT COUNT(*) FROM follows WHERE follower_id = ? AND following_id = ?");
    $stmt->execute([$followerId, $followingId]);

    return $stmt->fetchColumn() > 0;
}

获取用户关注列表

function getFollowingList($userId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

    $stmt = $db->prepare("
        SELECT u.id, u.username 
        FROM follows f 
        JOIN users u ON f.following_id = u.id 
        WHERE f.follower_id = ?
    ");
    $stmt->execute([$userId]);

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

获取用户粉丝列表

php 实现关注

function getFollowerList($userId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

    $stmt = $db->prepare("
        SELECT u.id, u.username 
        FROM follows f 
        JOIN users u ON f.follower_id = u.id 
        WHERE f.following_id = ?
    ");
    $stmt->execute([$userId]);

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

前端交互实现

关注按钮HTML

<button id="followBtn" data-user-id="<?php echo $targetUserId; ?>">
    <?php echo isFollowing($currentUserId, $targetUserId) ? '已关注' : '关注'; ?>
</button>

AJAX处理关注操作

$('#followBtn').click(function() {
    const userId = $(this).data('user-id');

    $.post('follow_action.php', {
        action: $(this).text() === '关注' ? 'follow' : 'unfollow',
        target_id: userId
    }, function(response) {
        if(response.success) {
            $('#followBtn').text(response.isFollowing ? '已关注' : '关注');
        }
    }, 'json');
});

PHP处理AJAX请求

header('Content-Type: application/json');

$action = $_POST['action'];
$targetId = $_POST['target_id'];
$currentUserId = $_SESSION['user_id']; // 假设用户已登录

$response = ['success' => false];

if($action === 'follow') {
    $response['success'] = followUser($currentUserId, $targetId);
    $response['isFollowing'] = true;
} elseif($action === 'unfollow') {
    $response['success'] = unfollowUser($currentUserId, $targetId);
    $response['isFollowing'] = false;
}

echo json_encode($response);

安全注意事项

验证用户身份确保只有登录用户能执行关注操作

php 实现关注

session_start();
if(!isset($_SESSION['user_id'])) {
    die(json_encode(['error' => '未登录']));
}

防止用户关注自己

if($currentUserId == $targetId) {
    die(json_encode(['error' => '不能关注自己']));
}

使用预处理语句防止SQL注入 所有数据库操作示例中已使用PDO预处理语句

性能优化建议

为关注关系表添加索引

CREATE INDEX idx_follower ON follows(follower_id);
CREATE INDEX idx_following ON follows(following_id);

考虑使用缓存减少数据库查询

// 使用Redis缓存关注关系
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cacheKey = "user:{$followerId}:following:{$followingId}";
if($redis->exists($cacheKey)) {
    return (bool)$redis->get($cacheKey);
}

标签: php
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="uploa…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HT…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE T…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…