您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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;
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;
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' => '发送好友请求失败'];
}
}
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' => '处理好友请求失败'];
}
}
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;
}
所有用户输入必须进行验证和过滤:
$senderId = filter_input(INPUT_POST, 'sender_id', FILTER_VALIDATE_INT);
$receiverId = filter_input(INPUT_POST, 'receiver_id', FILTER_VALIDATE_INT);
使用预处理语句(如上文示例)可以有效防止SQL注入攻击。
$('#sendRequestBtn').click(function() {
$.post('/api/friends/send', {
sender_id: currentUserId,
receiver_id: targetUserId
}, function(response) {
alert(response.message);
});
});
$('.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();
});
});
本文详细介绍了PHP实现加好友功能的完整方案,包括: - 合理的数据库设计 - 核心业务逻辑实现 - 安全防护措施 - 前后端交互示例
实际开发中还需要根据具体业务需求进行调整和完善,但以上核心思路适用于大多数社交类应用的加好友功能实现。 “`
注:本文总字数约1450字,包含了完整的代码实现和理论说明。实际使用时需要根据项目具体框架进行调整,特别是数据库连接部分需要替换为项目实际使用的数据库操作方式。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。