php实现站内私信功能
实现站内私信功能
站内私信功能需要数据库设计、用户交互逻辑和消息管理。以下是实现的关键步骤:
数据库设计
创建两个表:users(用户表)和messages(私信表)。messages表结构如下:
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
sender_id INT NOT NULL,
receiver_id INT NOT NULL,
subject VARCHAR(255),
content TEXT,
is_read BOOLEAN DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (sender_id) REFERENCES users(id),
FOREIGN KEY (receiver_id) REFERENCES users(id)
);
发送私信功能
创建发送表单页面(send_message.php):
<form action="send_message_handler.php" method="post">
<input type="hidden" name="sender_id" value="<?php echo $_SESSION['user_id']; ?>">
收件人: <input type="text" name="receiver_username" required><br>
主题: <input type="text" name="subject"><br>
内容: <textarea name="content" required></textarea><br>
<button type="submit">发送</button>
</form>
处理发送逻辑(send_message_handler.php):
session_start();
$sender_id = $_POST['sender_id'];
$receiver_username = $_POST['receiver_username'];
$subject = $_POST['subject'];
$content = $_POST['content'];
// 获取接收者ID
$stmt = $pdo->prepare("SELECT id FROM users WHERE username = ?");
$stmt->execute([$receiver_username]);
$receiver = $stmt->fetch();
if ($receiver) {
$stmt = $pdo->prepare("INSERT INTO messages (sender_id, receiver_id, subject, content) VALUES (?, ?, ?, ?)");
$stmt->execute([$sender_id, $receiver['id'], $subject, $content]);
header("Location: messages.php?success=1");
} else {
header("Location: send_message.php?error=user_not_found");
}
查看私信功能

创建收件箱页面(messages.php):
session_start();
$user_id = $_SESSION['user_id'];
// 获取收到的消息
$stmt = $pdo->prepare("SELECT m.*, u.username as sender_name FROM messages m JOIN users u ON m.sender_id = u.id WHERE m.receiver_id = ? ORDER BY m.created_at DESC");
$stmt->execute([$user_id]);
$received_messages = $stmt->fetchAll();
// 获取发送的消息
$stmt = $pdo->prepare("SELECT m.*, u.username as receiver_name FROM messages m JOIN users u ON m.receiver_id = u.id WHERE m.sender_id = ? ORDER BY m.created_at DESC");
$stmt->execute([$user_id]);
$sent_messages = $stmt->fetchAll();
标记为已读
当用户查看消息时更新状态:
$message_id = $_GET['id'];
$stmt = $pdo->prepare("UPDATE messages SET is_read = 1 WHERE id = ? AND receiver_id = ?");
$stmt->execute([$message_id, $_SESSION['user_id']]);
未读消息计数

在导航栏显示未读消息数量:
$stmt = $pdo->prepare("SELECT COUNT(*) as unread_count FROM messages WHERE receiver_id = ? AND is_read = 0");
$stmt->execute([$_SESSION['user_id']]);
$unread = $stmt->fetch();
echo $unread['unread_count'];
安全注意事项
验证用户会话和权限:
session_start();
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit;
}
防止SQL注入:
$stmt = $pdo->prepare("SELECT * FROM messages WHERE id = ?");
$stmt->execute([$message_id]);
扩展功能建议
实现消息搜索功能:
$search = "%".$_GET['q']."%";
$stmt = $pdo->prepare("SELECT * FROM messages WHERE (sender_id = ? OR receiver_id = ?) AND (subject LIKE ? OR content LIKE ?)");
$stmt->execute([$user_id, $user_id, $search, $search]);
添加消息删除功能:
$stmt = $pdo->prepare("DELETE FROM messages WHERE id = ? AND (sender_id = ? OR receiver_id = ?)");
$stmt->execute([$message_id, $user_id, $user_id]);


