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 BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (sender_id) REFERENCES users(id),
FOREIGN KEY (receiver_id) REFERENCES users(id)
);
发送消息功能
创建表单和处理脚本实现消息发送:
// 发送表单
<form action="send_message.php" method="post">
<input type="hidden" name="sender_id" value="<?php echo $_SESSION['user_id']; ?>">
收件人: <input type="text" name="receiver_id"><br>
主题: <input type="text" name="subject"><br>
内容: <textarea name="content"></textarea><br>
<button type="submit">发送</button>
</form>
// send_message.php
<?php
$senderId = $_POST['sender_id'];
$receiverId = $_POST['receiver_id'];
$subject = $_POST['subject'];
$content = $_POST['content'];
$stmt = $pdo->prepare("INSERT INTO messages (sender_id, receiver_id, subject, content) VALUES (?, ?, ?, ?)");
$stmt->execute([$senderId, $receiverId, $subject, $content]);
header("Location: inbox.php");
exit;
?>
收件箱功能
显示用户收到的消息:

<?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);
foreach ($messages as $message) {
echo "<div class='message" . ($message['is_read'] ? '' : ' unread') . "'>";
echo "<h3>{$message['subject']}</h3>";
echo "<p>来自: {$message['sender_name']}</p>";
echo "<p>{$message['content']}</p>";
echo "<small>" . date('Y-m-d H:i', strtotime($message['created_at'])) . "</small>";
echo "</div>";
}
?>
标记为已读
当用户查看消息时更新已读状态:
<?php
$messageId = $_GET['id'];
$stmt = $pdo->prepare("UPDATE messages SET is_read = TRUE WHERE id = ?");
$stmt->execute([$messageId]);
// 然后显示消息内容...
?>
消息计数
显示未读消息数量:
<?php
$userId = $_SESSION['user_id'];
$stmt = $pdo->prepare("SELECT COUNT(*) FROM messages WHERE receiver_id = ? AND is_read = FALSE");
$stmt->execute([$userId]);
$unreadCount = $stmt->fetchColumn();
echo "未读消息: $unreadCount";
?>
安全注意事项
- 验证用户身份,确保只能查看自己的消息
- 对输入数据进行过滤和验证,防止SQL注入
- 对敏感操作使用CSRF令牌
- 考虑实现消息删除功能
性能优化
- 对大量消息实现分页功能
- 添加适当的数据库索引
- 考虑使用缓存减少数据库查询
以上实现提供了站内短信的基本功能框架,可以根据实际需求进行扩展和优化。






