当前位置:首页 > PHP

php ajax实现在线聊天

2026-02-13 21:55:40PHP

PHP AJAX 实现在线聊天

数据库设计

创建数据库表存储聊天消息,字段包括消息ID、发送者ID、接收者ID、消息内容、发送时间等。

CREATE TABLE chat_messages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sender_id INT NOT NULL,
    receiver_id INT NOT NULL,
    message TEXT NOT NULL,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

前端实现

使用HTML和JavaScript创建聊天界面,通过AJAX与后端交互。

<div id="chat-container">
    <div id="chat-messages"></div>
    <input type="text" id="message-input" placeholder="输入消息...">
    <button id="send-button">发送</button>
</div>

<script>
document.getElementById('send-button').addEventListener('click', function() {
    const message = document.getElementById('message-input').value;
    const receiverId = 2; // 接收者ID

    const xhr = new XMLHttpRequest();
    xhr.open('POST', 'send_message.php', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.onload = function() {
        if (xhr.status === 200) {
            document.getElementById('message-input').value = '';
            fetchMessages();
        }
    };
    xhr.send(`message=${encodeURIComponent(message)}&receiver_id=${receiverId}`);
});

function fetchMessages() {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', 'get_messages.php', true);
    xhr.onload = function() {
        if (xhr.status === 200) {
            document.getElementById('chat-messages').innerHTML = xhr.responseText;
        }
    };
    xhr.send();
}

// 定期刷新消息
setInterval(fetchMessages, 3000);
</script>

后端处理

创建PHP文件处理消息发送和获取。

send_message.php

<?php
header('Content-Type: application/json');

$message = $_POST['message'];
$receiverId = $_POST['receiver_id'];
$senderId = 1; // 从会话中获取发送者ID

$db = new PDO('mysql:host=localhost;dbname=chat_db', 'username', 'password');
$stmt = $db->prepare("INSERT INTO chat_messages (sender_id, receiver_id, message) VALUES (?, ?, ?)");
$stmt->execute([$senderId, $receiverId, $message]);

echo json_encode(['status' => 'success']);
?>

get_messages.php

<?php
$receiverId = 2; // 接收者ID
$senderId = 1; // 发送者ID

$db = new PDO('mysql:host=localhost;dbname=chat_db', 'username', 'password');
$stmt = $db->prepare("SELECT * FROM chat_messages WHERE (sender_id = ? AND receiver_id = ?) OR (sender_id = ? AND receiver_id = ?) ORDER BY timestamp ASC");
$stmt->execute([$senderId, $receiverId, $receiverId, $senderId]);
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($messages as $msg) {
    $class = $msg['sender_id'] == $senderId ? 'sent' : 'received';
    echo "<div class='$class'>{$msg['message']}</div>";
}
?>

实时性优化

使用WebSocket或长轮询替代定期AJAX请求,实现更实时的消息推送。

长轮询实现

function longPoll() {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', 'long_poll.php', true);
    xhr.onload = function() {
        if (xhr.status === 200) {
            document.getElementById('chat-messages').innerHTML = xhr.responseText;
        }
        longPoll(); // 再次发起请求
    };
    xhr.send();
}
longPoll();

安全性考虑

对所有输入数据进行过滤和验证,防止SQL注入和XSS攻击。

php ajax实现在线聊天

$message = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF-8');
$receiverId = filter_var($_POST['receiver_id'], FILTER_VALIDATE_INT);

扩展功能

添加用户在线状态显示、消息已读标记、文件上传支持等功能,提升聊天体验。

标签: 在线php
分享给朋友:

相关文章

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…

php 实现锁

php 实现锁

PHP 实现锁的常见方法 文件锁(flock) 利用 flock 函数对文件进行独占锁定,适用于单机环境。 $fp = fopen("lockfile.lock", "w+"); if (flock…