php实现人脉
PHP实现人脉系统的基本思路
人脉系统通常涉及用户关系管理、社交网络功能和数据交互。PHP作为后端语言可以结合数据库实现这些功能。
数据库设计
创建用户表和关系表是基础。用户表存储用户信息,关系表记录用户间的关系类型和状态。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
CREATE TABLE relationships (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
friend_id INT NOT NULL,
status ENUM('pending', 'accepted', 'blocked') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
建立好友关系
实现好友请求发送功能需要处理表单提交并将数据插入关系表。
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['send_request'])) {
$userId = $_SESSION['user_id'];
$friendId = $_POST['friend_id'];
$stmt = $pdo->prepare("INSERT INTO relationships (user_id, friend_id, status) VALUES (?, ?, 'pending')");
$stmt->execute([$userId, $friendId]);
}
处理好友请求
提供接受或拒绝好友请求的接口,更新关系表中的状态字段。

if (isset($_GET['action']) && isset($_GET['relationship_id'])) {
$relationshipId = $_GET['relationship_id'];
$action = $_GET['action'];
if ($action === 'accept') {
$stmt = $pdo->prepare("UPDATE relationships SET status = 'accepted' WHERE id = ?");
$stmt->execute([$relationshipId]);
} elseif ($action === 'reject') {
$stmt = $pdo->prepare("DELETE FROM relationships WHERE id = ?");
$stmt->execute([$relationshipId]);
}
}
显示人脉列表
查询已建立的好友关系并展示给用户。
$userId = $_SESSION['user_id'];
$stmt = $pdo->prepare("
SELECT u.id, u.username
FROM relationships r
JOIN users u ON (r.friend_id = u.id OR r.user_id = u.id) AND u.id != ?
WHERE (r.user_id = ? OR r.friend_id = ?) AND r.status = 'accepted'
");
$stmt->execute([$userId, $userId, $userId]);
$friends = $stmt->fetchAll(PDO::FETCH_ASSOC);
人脉搜索功能
实现按用户名搜索潜在人脉的功能。

if (isset($_GET['search'])) {
$searchTerm = '%' . $_GET['search'] . '%';
$userId = $_SESSION['user_id'];
$stmt = $pdo->prepare("
SELECT id, username
FROM users
WHERE username LIKE ? AND id != ?
AND id NOT IN (
SELECT friend_id FROM relationships WHERE user_id = ?
UNION
SELECT user_id FROM relationships WHERE friend_id = ?
)
");
$stmt->execute([$searchTerm, $userId, $userId, $userId]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
安全性考虑
实施参数化查询防止SQL注入,验证用户权限确保用户只能操作自己的关系数据。
// 检查用户是否有权操作这条关系记录
$stmt = $pdo->prepare("SELECT * FROM relationships WHERE id = ? AND (friend_id = ? OR user_id = ?)");
$stmt->execute([$relationshipId, $userId, $userId]);
$relationship = $stmt->fetch();
if (!$relationship) {
die('无权操作此记录');
}
性能优化
为频繁查询的字段添加索引,考虑分页加载大量人脉数据。
ALTER TABLE relationships ADD INDEX (user_id);
ALTER TABLE relationships ADD INDEX (friend_id);
ALTER TABLE relationships ADD INDEX (status);
通知系统
实现好友请求通知功能,可以通过数据库或实时推送技术。
// 查询待处理的好友请求
$stmt = $pdo->prepare("
SELECT r.id, u.username
FROM relationships r
JOIN users u ON r.user_id = u.id
WHERE r.friend_id = ? AND r.status = 'pending'
");
$stmt->execute([$_SESSION['user_id']]);
$pendingRequests = $stmt->fetchAll(PDO::FETCH_ASSOC);






