当前位置:首页 > PHP

php实现私信功能

2026-02-16 06:37:18PHP

数据库设计

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

CREATE TABLE `conversations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user1_id` int(11) NOT NULL,
  `user2_id` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

CREATE TABLE `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `conversation_id` int(11) NOT NULL,
  `sender_id` int(11) NOT NULL,
  `content` text NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

发送私信功能

发送私信需要检查会话是否存在,若不存在则创建新会话,然后将消息存入数据库。

function sendMessage($senderId, $receiverId, $content) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

    // 检查会话是否存在
    $stmt = $db->prepare("SELECT id FROM conversations WHERE (user1_id = ? AND user2_id = ?) OR (user1_id = ? AND user2_id = ?)");
    $stmt->execute([$senderId, $receiverId, $receiverId, $senderId]);
    $conversation = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$conversation) {
        // 创建新会话
        $stmt = $db->prepare("INSERT INTO conversations (user1_id, user2_id) VALUES (?, ?)");
        $stmt->execute([$senderId, $receiverId]);
        $conversationId = $db->lastInsertId();
    } else {
        $conversationId = $conversation['id'];
    }

    // 插入消息
    $stmt = $db->prepare("INSERT INTO messages (conversation_id, sender_id, content) VALUES (?, ?, ?)");
    $stmt->execute([$conversationId, $senderId, $content]);

    return true;
}

获取会话列表

获取当前用户参与的所有会话列表。

function getConversations($userId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

    $stmt = $db->prepare("
        SELECT c.id, 
               CASE WHEN c.user1_id = ? THEN u2.username ELSE u1.username END AS other_user,
               CASE WHEN c.user1_id = ? THEN u2.id ELSE u1.id END AS other_user_id,
               m.content AS last_message,
               m.created_at AS last_message_time
        FROM conversations c
        LEFT JOIN users u1 ON c.user1_id = u1.id
        LEFT JOIN users u2 ON c.user2_id = u2.id
        LEFT JOIN messages m ON m.id = (
            SELECT id FROM messages WHERE conversation_id = c.id ORDER BY created_at DESC LIMIT 1
        )
        WHERE c.user1_id = ? OR c.user2_id = ?
        ORDER BY m.created_at DESC
    ");
    $stmt->execute([$userId, $userId, $userId, $userId]);

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

获取会话详情

获取某个会话中的所有消息内容。

function getMessages($conversationId, $userId) {
    $db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

    // 验证用户是否有权限访问该会话
    $stmt = $db->prepare("SELECT id FROM conversations WHERE id = ? AND (user1_id = ? OR user2_id = ?)");
    $stmt->execute([$conversationId, $userId, $userId]);
    $conversation = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$conversation) {
        return [];
    }

    // 获取消息
    $stmt = $db->prepare("
        SELECT m.*, u.username AS sender_name
        FROM messages m
        JOIN users u ON m.sender_id = u.id
        WHERE m.conversation_id = ?
        ORDER BY m.created_at ASC
    ");
    $stmt->execute([$conversationId]);

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

前端交互示例

使用Ajax实现前后端交互。

// 发送消息
$('#send-message').on('click', function() {
    $.post('send_message.php', {
        receiver_id: $('#receiver_id').val(),
        content: $('#message-content').val()
    }, function(response) {
        // 处理响应
    });
});

// 获取消息
function loadMessages(conversationId) {
    $.get('get_messages.php', {conversation_id: conversationId}, function(messages) {
        // 渲染消息列表
    });
}

安全性考虑

验证用户身份和权限,防止越权访问。使用预处理语句防止SQL注入。敏感操作需要验证会话有效性。

php实现私信功能

session_start();
if (!isset($_SESSION['user_id'])) {
    die('Unauthorized');
}

以上实现涵盖了私信功能的核心部分,包括数据库设计、消息发送、会话列表和消息获取等功能。可根据实际需求进行扩展,如添加已读状态、消息通知等功能。

标签: 私信功能
分享给朋友:

相关文章

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备 准备需要筛选的数据源,通常是一个数组,可以存储在Vue组件的…

vue的艾特功能实现

vue的艾特功能实现

Vue 中的 @ 功能实现 Vue 中的 @ 符号是 v-on 指令的简写,用于绑定事件监听器。以下是具体实现方式: 基本语法 <button @click="handleClick">…

uniapp实现支付功能

uniapp实现支付功能

支付功能实现概述 在UniApp中实现支付功能通常需要对接第三方支付平台(如微信支付、支付宝支付等)。以下是基于微信支付和支付宝支付的通用实现流程。 微信支付实现步骤 1. 配置支付权限 在微信开放…

vue实现收货功能

vue实现收货功能

实现收货功能的基本思路 在Vue中实现收货功能通常涉及前端界面交互、后端API调用以及状态管理。以下是关键步骤和代码示例: 页面布局与数据绑定 使用Vue的模板语法构建收货表单,包含收货人、联系方式…

h5实现手机摇一摇功能

h5实现手机摇一摇功能

实现原理 手机摇一摇功能基于设备加速度传感器(DeviceMotionEvent),通过监听设备的加速度变化来判断用户是否进行了摇晃动作。HTML5提供了相关API获取设备传感器数据。 基本实现步骤…

vue实现截图功能

vue实现截图功能

Vue实现截图功能的方法 使用html2canvas库 html2canvas是一个流行的JavaScript库,可以将HTML元素转换为Canvas,进而生成图片。在Vue项目中安装html2can…