当前位置:首页 > PHP

php 站内消息 实现

2026-02-15 10:18:26PHP

站内消息系统设计要点

数据库表设计需要包含消息表(messages),通常包含字段:id、sender_id、receiver_id、content、created_at、is_read等。用户表(users)用于关联发送者和接收者。

消息表建议结构:

CREATE TABLE `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sender_id` int(11) NOT NULL,
  `receiver_id` int(11) NOT NULL,
  `subject` varchar(255) DEFAULT NULL,
  `content` text NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `is_read` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `sender_id` (`sender_id`),
  KEY `receiver_id` (`receiver_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

消息发送功能实现

创建消息发送表单(send_message.php):

<form action="send_message_process.php" method="post">
    <input type="hidden" name="sender_id" value="<?php echo $_SESSION['user_id']; ?>">
    <div>
        <label>接收者ID:</label>
        <input type="text" name="receiver_id" required>
    </div>
    <div>
        <label>主题:</label>
        <input type="text" name="subject">
    </div>
    <div>
        <label>内容:</label>
        <textarea name="content" required></textarea>
    </div>
    <button type="submit">发送</button>
</form>

处理发送逻辑(send_message_process.php):

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

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $senderId = $_POST['sender_id'];
    $receiverId = $_POST['receiver_id'];
    $subject = htmlspecialchars($_POST['subject']);
    $content = htmlspecialchars($_POST['content']);

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

    header("Location: messages.php?status=sent");
    exit;
}
?>

消息接收与展示

获取用户收件箱(inbox.php):

php 站内消息 实现

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

$userId = $_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([$userId]);
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<ul>
<?php foreach ($messages as $message): ?>
    <li class="<?php echo $message['is_read'] ? 'read' : 'unread'; ?>">
        <strong><?php echo $message['sender_name']; ?></strong>
        <span><?php echo $message['subject']; ?></span>
        <p><?php echo $message['content']; ?></p>
        <small><?php echo $message['created_at']; ?></small>
    </li>
<?php endforeach; ?>
</ul>

消息状态更新

标记消息为已读(mark_as_read.php):

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

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

    // 验证消息属于当前用户
    $stmt = $pdo->prepare("UPDATE messages SET is_read = 1 WHERE id = ? AND receiver_id = ?");
    $stmt->execute([$messageId, $userId]);

    header("Location: inbox.php");
    exit;
}
?>

实时消息提醒

使用AJAX轮询检查新消息:

setInterval(function() {
    $.ajax({
        url: 'check_new_messages.php',
        type: 'GET',
        success: function(response) {
            if (response.count > 0) {
                $('#message-notification').text(response.count).show();
            } else {
                $('#message-notification').hide();
            }
        }
    });
}, 30000); // 每30秒检查一次

后端检查新消息(check_new_messages.php):

php 站内消息 实现

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

$userId = $_SESSION['user_id'];
$stmt = $pdo->prepare("SELECT COUNT(*) as count FROM messages WHERE receiver_id = ? AND is_read = 0");
$stmt->execute([$userId]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);

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

安全与优化建议

对用户输入进行严格过滤和验证,防止SQL注入和XSS攻击。使用预处理语句处理数据库查询。

添加分页功能处理大量消息:

$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$limit = 10;
$offset = ($page - 1) * $limit;

$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
                      LIMIT ? OFFSET ?");
$stmt->execute([$userId, $limit, $offset]);

考虑添加消息删除功能:

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

标签: 站内消息
分享给朋友:

相关文章

Vue消息队列实现

Vue消息队列实现

Vue 消息队列实现方法 在 Vue 中实现消息队列可以通过多种方式,以下是几种常见的方法: 使用 Vuex 状态管理 Vuex 可以用于管理全局状态,适合实现消息队列功能。通过 mutations…

vue 消息提醒实现

vue 消息提醒实现

Vue 消息提醒实现方法 使用 Vue 内置的 $notify 方法 Vue 提供了一个内置的 $notify 方法,可以用于显示消息提醒。需要在 Vue 实例中注册该方法。 Vue.prototy…

vue实现消息通知

vue实现消息通知

Vue 实现消息通知的方法 使用 Vue 的自定义事件系统 Vue 的自定义事件系统可以通过 $emit 和 $on 实现组件间的消息通知。创建一个全局事件总线,用于跨组件通信。 // 创建事件总线…

vue实现消息动画

vue实现消息动画

Vue 实现消息动画的方法 使用 Vue Transition 组件 Vue 内置的 <transition> 组件可以方便地实现消息动画效果。通过添加 CSS 过渡或动画类名,可以实现平…

vue框架实现消息提醒

vue框架实现消息提醒

Vue 框架实现消息提醒的方法 使用 Vue 的组件化特性创建消息提醒组件 创建一个独立的 Notification 组件,通过 props 接收消息内容、类型和显示时间等参数。组件内部使用 v-if…

vue中实现消息滚动

vue中实现消息滚动

Vue 中实现消息滚动的方法 使用 CSS 动画实现滚动 通过 CSS 的 animation 和 @keyframes 实现消息的平滑滚动效果。 <template> <d…