c语言编程笔录

首页 >   > 笔记大全

笔记大全

用 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);
?>

        <?php foreach ($messages as $message): ?>
            
        <?php endforeach; ?>
    
发送者 内容 时间 未读 删除
<?= $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;
?>
第四段:总结 我们现在拥有一个简单但有用的私信功能,允许用户之间发送私人消息,并能在网站内查看和管理这些消息。我们的数据库设计和代码实现健壮而易于扩展,只需根据需要添加更多功能即可。如果用户量较大,我们可以使用缓存和分片等技术优化我们的系统性能。