用 PHP 开发知识问答网站私信功能
更新时间:2023-10-10
第一段:需求解析
我们需要为知识问答网站添加私信功能,用户可以在网站内部向其它用户发送私人消息。我们需要以下功能:
1. 用户可以发送私人消息。
2. 用户可以查看自己的私人消息列表。
3. 用户可以查看某个私人消息的详细内容。
4. 用户可以标记私人消息为已读或未读状态。
5. 用户可以删除自己发送或接收的私人消息。
第二段:设计数据库和表结构
我们需要在数据库中新建表来存储私人消息,包括以下字段:
1. id:私信的唯一标识符。
2. from_user:私信发送者的用户ID。
3. to_user:私信接收者的用户ID。
4. content:私信的正文内容。
5. create_time:私信创建的时间。
6. is_read:私信的状态,已读或未读。
7. is_deleted:私信的删除状态,已删除或未删除。
我们可以用以下代码来创建私人消息的表:
CREATE TABLE `messages` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `from_user` int(11) unsigned NOT NULL, `to_user` int(11) unsigned NOT NULL, `content` text NOT NULL, `create_time` datetime NOT NULL, `is_read` tinyint(1) NOT NULL DEFAULT '0', `is_deleted` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;第三段:编写PHP代码 我们需要编写以下PHP代码文件: 1. send_message.php:用于处理用户发送私人消息的请求。 2. message_list.php:用于显示用户的私人消息列表。 3. message_detail.php:用于显示某个私人消息的详细内容。 4. mark_read.php:用于标记私人消息为已读状态。 5. mark_delete.php:用于标记私人消息为已删除状态。 以下是每个PHP文件的代码示例。
send_message.php
<?php session_start(); include 'db.php'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $from_user = $_SESSION['user_id']; $to_user = $_POST['to_user']; $content = $_POST['content']; $stmt = $db->prepare('INSERT INTO messages (from_user, to_user, content, create_time) VALUES (?, ?, ?, now())'); $stmt->bind_param('iis', $from_user, $to_user, $content); $stmt->execute(); header('Location: message_list.php'); exit; } ?>
message_list.php
<?php session_start(); include 'db.php'; $user_id = $_SESSION['user_id']; $stmt = $db->prepare('SELECT * FROM messages WHERE (from_user = ? OR to_user = ?) AND is_deleted = 0 ORDER BY create_time DESC'); $stmt->bind_param('ii', $user_id, $user_id); $stmt->execute(); $result = $stmt->get_result(); $messages = $result->fetch_all(MYSQLI_ASSOC); ?>
发送者 | 内容 | 时间 | 未读 | 删除 |
---|---|---|---|---|
<?= $message['from_user'] ?> | <?= $message['content'] ?> | <?= $message['create_time'] ?> | <?php if ($message['to_user'] == $user_id && !$message['is_read']): ?> 标记已读 <?php endif; ?> | 删除 |
message_detail.php
<?php session_start(); include 'db.php'; $user_id = $_SESSION['user_id']; $message_id = $_GET['id']; $stmt = $db->prepare('SELECT * FROM messages WHERE (from_user = ? OR to_user = ?) AND id = ? AND is_deleted = 0'); $stmt->bind_param('iii', $user_id, $user_id, $message_id); $stmt->execute(); $result = $stmt->get_result(); $message = $result->fetch_assoc(); if ($message['to_user'] == $user_id && !$message['is_read']) { $stmt = $db->prepare('UPDATE messages SET is_read = 1 WHERE id = ?'); $stmt->bind_param('i', $message_id); $stmt->execute(); } ?><?= $message['content'] ?>
<?= $message['create_time'] ?>
<?= $message['from_user'] ?>
mark_read.php
<?php session_start(); include 'db.php'; $user_id = $_SESSION['user_id']; $message_id = $_GET['id']; $stmt = $db->prepare('UPDATE messages SET is_read = 1 WHERE id = ? AND to_user = ?'); $stmt->bind_param('ii', $message_id, $user_id); $stmt->execute(); header('Location: message_list.php'); exit; ?>
mark_delete.php
<?php session_start(); include 'db.php'; $user_id = $_SESSION['user_id']; $message_id = $_GET['id']; $stmt = $db->prepare('UPDATE messages SET is_deleted = 1 WHERE id = ? AND (from_user = ? OR to_user = ?)'); $stmt->bind_param('iii', $message_id, $user_id, $user_id); $stmt->execute(); header('Location: message_list.php'); exit; ?>第四段:总结 我们现在拥有一个简单但有用的私信功能,允许用户之间发送私人消息,并能在网站内查看和管理这些消息。我们的数据库设计和代码实现健壮而易于扩展,只需根据需要添加更多功能即可。如果用户量较大,我们可以使用缓存和分片等技术优化我们的系统性能。