php实现站内信
PHP实现站内信功能
站内信是网站内部用户之间进行消息交流的功能,可以通过数据库存储和PHP后端处理实现。以下是实现站内信功能的关键步骤:
数据库设计 创建消息表存储站内信数据,表结构建议包含以下字段:
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 TINYINT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (sender_id) REFERENCES users(id),
FOREIGN KEY (receiver_id) REFERENCES users(id)
);
发送消息功能 创建表单页面让用户填写消息内容,处理表单提交将数据存入数据库:
// 发送消息处理
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$senderId = $_SESSION['user_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');
}
收件箱功能 查询当前用户作为接收者的所有消息:
$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);
消息阅读状态 当用户查看消息时更新阅读状态:
$messageId = $_GET['id'];
$stmt = $pdo->prepare("UPDATE messages SET is_read = 1 WHERE id = ? AND receiver_id = ?");
$stmt->execute([$messageId, $_SESSION['user_id']]);
用户界面 创建简单的HTML界面展示消息列表和详情:
<div class="message-list">
<?php foreach ($messages as $msg): ?>
<div class="message <?= $msg['is_read'] ? '' : 'unread' ?>">
<span class="sender"><?= $msg['sender_name'] ?></span>
<span class="subject"><?= $msg['subject'] ?></span>
<span class="time"><?= $msg['created_at'] ?></span>
<a href="view_message.php?id=<?= $msg['id'] ?>">查看</a>
</div>
<?php endforeach; ?>
</div>
安全性考虑
- 对所有用户输入使用
htmlspecialchars()过滤 - 使用预处理语句防止SQL注入
- 验证当前用户是否有权限查看特定消息
- 实现CSRF保护
扩展功能建议
- 添加消息回复功能
- 实现消息分类(收件箱、发件箱)
- 添加消息搜索功能
- 设置消息删除功能(软删除)
- 增加未读消息计数显示
- 实现消息附件上传功能
通过以上方法可以实现基本的站内信功能,根据实际需求可以进一步扩展和完善。







