当前位置:首页 > PHP

php实现站内私信功能

2026-01-28 22:59:20PHP

实现站内私信功能

站内私信功能需要数据库设计、用户交互逻辑和消息管理。以下是实现的关键步骤:

数据库设计

创建两个表: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");
}

查看私信功能

php实现站内私信功能

创建收件箱页面(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']]);

未读消息计数

php实现站内私信功能

在导航栏显示未读消息数量:

$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]);

标签: 站内私信
分享给朋友:

相关文章

php站内信实现

php站内信实现

PHP 站内信功能实现 站内信功能通常包括发送、接收、查看和删除消息等基本操作。以下是实现站内信功能的详细方法: 数据库设计 创建两个表:users(用户表)和messages(站内信表)。…

php实现站内公告

php实现站内公告

实现站内公告的PHP方法 数据库设计 创建公告表announcements,包含字段:id(主键)、title(标题)、content(内容)、created_at(发布时间)、is_active(是…