php实现私信功能
数据库设计
私信功能通常需要设计两个主要数据表:messages 和 conversations。conversations 表用于存储会话信息,messages 表用于存储具体的消息内容。
CREATE TABLE `conversations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user1_id` int(11) NOT NULL,
`user2_id` int(11) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
CREATE TABLE `messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`conversation_id` int(11) NOT NULL,
`sender_id` int(11) NOT NULL,
`content` text NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
发送私信功能
发送私信需要检查会话是否存在,若不存在则创建新会话,然后将消息存入数据库。

function sendMessage($senderId, $receiverId, $content) {
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 检查会话是否存在
$stmt = $db->prepare("SELECT id FROM conversations WHERE (user1_id = ? AND user2_id = ?) OR (user1_id = ? AND user2_id = ?)");
$stmt->execute([$senderId, $receiverId, $receiverId, $senderId]);
$conversation = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$conversation) {
// 创建新会话
$stmt = $db->prepare("INSERT INTO conversations (user1_id, user2_id) VALUES (?, ?)");
$stmt->execute([$senderId, $receiverId]);
$conversationId = $db->lastInsertId();
} else {
$conversationId = $conversation['id'];
}
// 插入消息
$stmt = $db->prepare("INSERT INTO messages (conversation_id, sender_id, content) VALUES (?, ?, ?)");
$stmt->execute([$conversationId, $senderId, $content]);
return true;
}
获取会话列表
获取当前用户参与的所有会话列表。
function getConversations($userId) {
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $db->prepare("
SELECT c.id,
CASE WHEN c.user1_id = ? THEN u2.username ELSE u1.username END AS other_user,
CASE WHEN c.user1_id = ? THEN u2.id ELSE u1.id END AS other_user_id,
m.content AS last_message,
m.created_at AS last_message_time
FROM conversations c
LEFT JOIN users u1 ON c.user1_id = u1.id
LEFT JOIN users u2 ON c.user2_id = u2.id
LEFT JOIN messages m ON m.id = (
SELECT id FROM messages WHERE conversation_id = c.id ORDER BY created_at DESC LIMIT 1
)
WHERE c.user1_id = ? OR c.user2_id = ?
ORDER BY m.created_at DESC
");
$stmt->execute([$userId, $userId, $userId, $userId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
获取会话详情
获取某个会话中的所有消息内容。

function getMessages($conversationId, $userId) {
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 验证用户是否有权限访问该会话
$stmt = $db->prepare("SELECT id FROM conversations WHERE id = ? AND (user1_id = ? OR user2_id = ?)");
$stmt->execute([$conversationId, $userId, $userId]);
$conversation = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$conversation) {
return [];
}
// 获取消息
$stmt = $db->prepare("
SELECT m.*, u.username AS sender_name
FROM messages m
JOIN users u ON m.sender_id = u.id
WHERE m.conversation_id = ?
ORDER BY m.created_at ASC
");
$stmt->execute([$conversationId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
前端交互示例
使用Ajax实现前后端交互。
// 发送消息
$('#send-message').on('click', function() {
$.post('send_message.php', {
receiver_id: $('#receiver_id').val(),
content: $('#message-content').val()
}, function(response) {
// 处理响应
});
});
// 获取消息
function loadMessages(conversationId) {
$.get('get_messages.php', {conversation_id: conversationId}, function(messages) {
// 渲染消息列表
});
}
安全性考虑
验证用户身份和权限,防止越权访问。使用预处理语句防止SQL注入。敏感操作需要验证会话有效性。
session_start();
if (!isset($_SESSION['user_id'])) {
die('Unauthorized');
}
以上实现涵盖了私信功能的核心部分,包括数据库设计、消息发送、会话列表和消息获取等功能。可根据实际需求进行扩展,如添加已读状态、消息通知等功能。






