php如何实现加好友功能

发布时间:2021-10-27 11:03:17 作者:iii
来源:亿速云 阅读:350
# PHP如何实现加好友功能

在现代社交网络和即时通讯应用中,"加好友"是最基础的核心功能之一。本文将详细介绍如何使用PHP结合MySQL数据库实现完整的加好友功能体系。

## 一、数据库设计

### 1.1 用户表(users)
```sql
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  `password` varchar(255) NOT NULL,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

1.2 好友关系表(friendships)

CREATE TABLE `friendships` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `friend_id` int(11) NOT NULL,
  `status` enum('pending','accepted','rejected') DEFAULT 'pending',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_friendship` (`user_id`,`friend_id`),
  KEY `friend_id` (`friend_id`),
  CONSTRNT `friendships_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
  CONSTRNT `friendships_ibfk_2` FOREIGN KEY (`friend_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

二、核心功能实现

2.1 发送好友请求

function sendFriendRequest($senderId, $receiverId) {
    global $conn;
    
    // 检查是否已经是好友
    $checkSql = "SELECT * FROM friendships 
                WHERE (user_id = ? AND friend_id = ?) 
                OR (user_id = ? AND friend_id = ?)";
    $stmt = $conn->prepare($checkSql);
    $stmt->bind_param("iiii", $senderId, $receiverId, $receiverId, $senderId);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if($result->num_rows > 0) {
        return ['status' => 'error', 'message' => '好友关系已存在'];
    }
    
    // 插入好友请求
    $insertSql = "INSERT INTO friendships (user_id, friend_id, status) VALUES (?, ?, 'pending')";
    $stmt = $conn->prepare($insertSql);
    $stmt->bind_param("ii", $senderId, $receiverId);
    
    if($stmt->execute()) {
        return ['status' => 'success', 'message' => '好友请求已发送'];
    } else {
        return ['status' => 'error', 'message' => '发送好友请求失败'];
    }
}

2.2 处理好友请求

function respondFriendRequest($requestId, $userId, $action) {
    global $conn;
    
    // 验证请求是否存在且属于当前用户
    $checkSql = "SELECT * FROM friendships WHERE id = ? AND friend_id = ? AND status = 'pending'";
    $stmt = $conn->prepare($checkSql);
    $stmt->bind_param("ii", $requestId, $userId);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if($result->num_rows == 0) {
        return ['status' => 'error', 'message' => '无效的好友请求'];
    }
    
    // 更新状态
    $status = ($action == 'accept') ? 'accepted' : 'rejected';
    $updateSql = "UPDATE friendships SET status = ?, updated_at = NOW() WHERE id = ?";
    $stmt = $conn->prepare($updateSql);
    $stmt->bind_param("si", $status, $requestId);
    
    if($stmt->execute()) {
        // 如果是接受,则创建反向关系记录
        if($action == 'accept') {
            $request = $result->fetch_assoc();
            $reverseSql = "INSERT INTO friendships (user_id, friend_id, status) VALUES (?, ?, 'accepted')";
            $stmt = $conn->prepare($reverseSql);
            $stmt->bind_param("ii", $userId, $request['user_id']);
            $stmt->execute();
        }
        
        return ['status' => 'success', 'message' => "好友请求已{$action}"];
    } else {
        return ['status' => 'error', 'message' => '处理好友请求失败'];
    }
}

2.3 获取好友列表

function getFriendList($userId, $status = 'accepted') {
    global $conn;
    
    $sql = "SELECT u.id, u.username, u.email, f.created_at 
            FROM friendships f
            JOIN users u ON f.friend_id = u.id
            WHERE f.user_id = ? AND f.status = ?
            ORDER BY u.username ASC";
    
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("is", $userId, $status);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $friends = [];
    while($row = $result->fetch_assoc()) {
        $friends[] = $row;
    }
    
    return $friends;
}

三、安全与优化

3.1 输入验证

所有用户输入必须进行验证和过滤:

$senderId = filter_input(INPUT_POST, 'sender_id', FILTER_VALIDATE_INT);
$receiverId = filter_input(INPUT_POST, 'receiver_id', FILTER_VALIDATE_INT);

3.2 防止SQL注入

使用预处理语句(如上文示例)可以有效防止SQL注入攻击。

3.3 性能优化

  1. 为常用查询字段添加索引
  2. 对大用户量系统考虑分表策略
  3. 实现缓存机制减少数据库查询

四、前端交互示例

4.1 发送好友请求(AJAX)

$('#sendRequestBtn').click(function() {
    $.post('/api/friends/send', {
        sender_id: currentUserId,
        receiver_id: targetUserId
    }, function(response) {
        alert(response.message);
    });
});

4.2 处理好友请求

$('.accept-btn').click(function() {
    let requestId = $(this).data('request-id');
    $.post('/api/friends/respond', {
        request_id: requestId,
        user_id: currentUserId,
        action: 'accept'
    }, function(response) {
        location.reload();
    });
});

五、扩展功能

  1. 好友推荐系统:基于共同好友或兴趣推荐
  2. 好友分组:实现分组管理功能
  3. 黑名单系统:防止骚扰
  4. 好友请求限制:防止滥用

六、总结

本文详细介绍了PHP实现加好友功能的完整方案,包括: - 合理的数据库设计 - 核心业务逻辑实现 - 安全防护措施 - 前后端交互示例

实际开发中还需要根据具体业务需求进行调整和完善,但以上核心思路适用于大多数社交类应用的加好友功能实现。 “`

注:本文总字数约1450字,包含了完整的代码实现和理论说明。实际使用时需要根据项目具体框架进行调整,特别是数据库连接部分需要替换为项目实际使用的数据库操作方式。

推荐阅读:
  1. php编译后还能加扩展功能吗
  2. php和redis实现加解锁的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:分布式下的WebSocket解决方案是什么

下一篇:Mysql数据分组排名实现的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》