当前位置:首页 > 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");
}

查看私信功能

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

添加消息删除功能:

php实现站内私信功能

$stmt = $pdo->prepare("DELETE FROM messages WHERE id = ? AND (sender_id = ? OR receiver_id = ?)");
$stmt->execute([$message_id, $user_id, $user_id]);

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

相关文章

vue实现站内信

vue实现站内信

Vue 实现站内信功能 前端实现 组件结构设计 创建 MessageList.vue 和 MessageDetail.vue 组件,分别用于展示消息列表和消息详情。使用 Vue Router 实现页面…

php实现私信

php实现私信

实现私信功能的PHP方案 私信功能通常涉及用户间消息的发送、存储和展示。以下是实现私信功能的核心模块和代码示例: 数据库设计 创建消息表存储私信记录: CREATE TABLE private_m…

php实现站内公告

php实现站内公告

PHP 实现站内公告的方法 数据库设计 创建一个公告表(例如 announcements),包含字段如 id、title、content、created_at 和 is_active。is_activ…

php 站内消息 实现

php 站内消息 实现

站内消息系统设计要点 数据库表设计需要包含消息表(messages),通常包含字段:id、sender_id、receiver_id、content、created_at、is_read等。用户表(u…

PHP私信怎么实现

PHP私信怎么实现

PHP私信功能实现方法 数据库设计 创建私信相关的数据表结构,通常需要messages表存储消息内容,users表存储用户信息。 CREATE TABLE users ( id INT AU…

php实现私信功能

php实现私信功能

数据库设计 私信功能通常需要设计两个主要数据表:messages 和 conversations。conversations 表用于存储会话信息,messages 表用于存储具体的消息内容。 CRE…