php站内信实现
站内信系统设计
站内信系统通常包含用户发送、接收、查看和管理消息的功能。以下是实现站内信系统的基本步骤和代码示例。
数据库设计
创建必要的表结构存储用户和消息数据。

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
sender_id INT NOT NULL,
receiver_id INT NOT NULL,
subject VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (sender_id) REFERENCES users(id),
FOREIGN KEY (receiver_id) REFERENCES users(id)
);
发送站内信
使用PHP处理表单提交并将消息存入数据库。
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$sender_id = $_POST['sender_id'];
$receiver_id = $_POST['receiver_id'];
$subject = $_POST['subject'];
$content = $_POST['content'];
$stmt = $pdo->prepare("INSERT INTO messages (sender_id, receiver_id, subject, content) VALUES (?, ?, ?, ?)");
$stmt->execute([$sender_id, $receiver_id, $subject, $content]);
header("Location: messages.php");
exit;
}
?>
接收站内信
查询数据库获取用户收到的消息。

<?php
$receiver_id = $_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([$receiver_id]);
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
标记为已读
当用户查看消息时更新为已读状态。
<?php
$message_id = $_GET['id'];
$stmt = $pdo->prepare("UPDATE messages SET is_read = TRUE WHERE id = ?");
$stmt->execute([$message_id]);
?>
前端展示
使用HTML和CSS展示消息列表和详情。
<div class="message-list">
<?php foreach ($messages as $message): ?>
<div class="message <?= $message['is_read'] ? 'read' : 'unread' ?>">
<h3><?= htmlspecialchars($message['subject']) ?></h3>
<p>From: <?= htmlspecialchars($message['sender_name']) ?></p>
<p><?= nl2br(htmlspecialchars($message['content'])) ?></p>
<small><?= $message['created_at'] ?></small>
</div>
<?php endforeach; ?>
</div>
安全注意事项
- 使用预处理语句防止SQL注入
- 对输出内容进行HTML转义防止XSS攻击
- 验证用户权限确保只能查看自己的消息
扩展功能
- 添加消息回复功能
- 实现消息分类(收件箱、发件箱)
- 增加消息搜索功能
- 添加附件支持
- 实现消息删除和归档
以上代码和结构提供了PHP站内信系统的基本实现框架,可根据实际需求进行扩展和优化。






