当前位置:首页 > PHP

php实现站内私信功能

2026-02-27 20:03:00PHP

数据库设计

创建两个表用于存储私信数据。messages表存储私信内容,message_status表存储阅读状态。

CREATE TABLE messages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sender_id INT NOT NULL,
    receiver_id INT NOT NULL,
    content TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (sender_id) REFERENCES users(id),
    FOREIGN KEY (receiver_id) REFERENCES users(id)
);

CREATE TABLE message_status (
    id INT AUTO_INCREMENT PRIMARY KEY,
    message_id INT NOT NULL,
    user_id INT NOT NULL,
    is_read BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (message_id) REFERENCES messages(id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

发送私信功能

创建发送私信的PHP处理脚本,验证用户身份并插入数据。

php实现站内私信功能

<?php
session_start();
require 'db_connect.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_SESSION['user_id'])) {
    $senderId = $_SESSION['user_id'];
    $receiverId = filter_input(INPUT_POST, 'receiver_id', FILTER_VALIDATE_INT);
    $content = trim(filter_input(INPUT_POST, 'content', FILTER_SANITIZE_STRING));

    if ($receiverId && $content) {
        try {
            $stmt = $pdo->prepare("INSERT INTO messages (sender_id, receiver_id, content) VALUES (?, ?, ?)");
            $stmt->execute([$senderId, $receiverId, $content]);

            $messageId = $pdo->lastInsertId();
            $stmt = $pdo->prepare("INSERT INTO message_status (message_id, user_id) VALUES (?, ?)");
            $stmt->execute([$messageId, $receiverId]);

            echo json_encode(['status' => 'success']);
        } catch (PDOException $e) {
            echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
        }
    }
}
?>

获取私信列表

实现获取用户私信列表的功能,包括未读消息标记。

<?php
session_start();
require 'db_connect.php';

if (isset($_SESSION['user_id'])) {
    $userId = $_SESSION['user_id'];

    $stmt = $pdo->prepare("
        SELECT m.*, u.username as sender_name, ms.is_read
        FROM messages m
        JOIN users u ON m.sender_id = u.id
        JOIN message_status ms ON m.id = ms.message_id AND ms.user_id = ?
        WHERE m.receiver_id = ?
        ORDER BY m.created_at DESC
    ");
    $stmt->execute([$userId, $userId]);
    $messages = $stmt->fetchAll(PDO::FETCH_ASSOC);

    header('Content-Type: application/json');
    echo json_encode($messages);
}
?>

标记为已读

当用户查看私信时,更新阅读状态。

php实现站内私信功能

<?php
session_start();
require 'db_connect.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_SESSION['user_id'])) {
    $messageId = filter_input(INPUT_POST, 'message_id', FILTER_VALIDATE_INT);
    $userId = $_SESSION['user_id'];

    if ($messageId) {
        $stmt = $pdo->prepare("UPDATE message_status SET is_read = TRUE WHERE message_id = ? AND user_id = ?");
        $stmt->execute([$messageId, $userId]);
        echo json_encode(['status' => 'success']);
    }
}
?>

前端交互示例

使用jQuery实现简单的AJAX交互。

// 发送私信
$('#send-message-form').submit(function(e) {
    e.preventDefault();
    $.post('send_message.php', $(this).serialize(), function(response) {
        if (response.status === 'success') {
            $('#message-content').val('');
            loadMessages();
        }
    }, 'json');
});

// 加载私信列表
function loadMessages() {
    $.get('get_messages.php', function(messages) {
        let html = '';
        messages.forEach(msg => {
            html += `<div class="message ${msg.is_read ? '' : 'unread'}">
                <strong>${msg.sender_name}</strong>
                <p>${msg.content}</p>
                <small>${new Date(msg.created_at).toLocaleString()}</small>
            </div>`;
        });
        $('#messages-container').html(html);
    }, 'json');
}

// 标记为已读
$(document).on('click', '.message', function() {
    const messageId = $(this).data('id');
    $.post('mark_as_read.php', {message_id: messageId});
});

安全注意事项

验证用户身份和权限,防止跨站请求伪造(CSRF)。

// 在所有处理脚本开头添加
if (!isset($_SESSION['user_id'])) {
    header('HTTP/1.1 403 Forbidden');
    exit;
}

// 在表单中添加CSRF令牌
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
// 验证CSRF令牌
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    header('HTTP/1.1 403 Forbidden');
    exit;
}

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

相关文章

php实现站内公告

php实现站内公告

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

php实现私信

php实现私信

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

php站内信实现

php站内信实现

站内信功能概述 站内信是网站内部用户之间通信的系统,通常包含发送、接收、查看和删除等功能。PHP实现需结合数据库存储消息数据,并通过前端界面交互。 数据库设计 创建消息表存储站内信数据,基础字段包括…

php实现站内公告

php实现站内公告

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

php实现私信

php实现私信

实现私信功能的基本思路 私信功能通常涉及用户之间的消息发送、接收和存储。在PHP中实现私信功能需要结合数据库操作、用户认证和前端交互。 数据库设计 创建两个主要表来存储私信数据: users 表存…

php实现站内信

php实现站内信

PHP实现站内信功能 站内信是网站内部用户之间进行消息交流的功能,可以通过数据库存储和PHP后端处理实现。以下是实现站内信功能的关键步骤: 数据库设计 创建消息表存储站内信数据,表结构建议包含以下字…