You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

校园系统管理员操作日志实现需求及代码咨询

校园管理系统操作日志实现方案与代码优化

看起来你已经迈出了第一步——获取当前登录管理员的用户名,不过代码片段没写完,我来帮你完善整套操作日志的实现逻辑,确保每一项关键操作都能清晰记录执行者和操作详情。

核心思路

  • 每次执行添加/修改/删除学生、系统配置变更等关键操作时,先获取当前登录管理员的身份(你已经通过$_SESSION['username']实现了这一步)
  • 新建专门的日志表存储操作记录,包含执行者、操作类型、操作内容、操作时间等核心信息
  • 注意防护SQL注入,保证日志数据的安全性和完整性

完整实现步骤

1. 创建日志存储表(SQL)

首先在数据库中新建一个operation_logs表,用来统一存储所有操作日志:

CREATE TABLE operation_logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    operator VARCHAR(50) NOT NULL, -- 执行者用户名
    operation_type VARCHAR(50) NOT NULL, -- 操作类型:比如"添加学生"、"修改学生信息"
    operation_content TEXT NOT NULL, -- 操作详情:比如"添加学生:张三,班级ID:101"
    operation_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 操作时间,自动生成
);

2. 完善PHP代码,添加日志记录逻辑

以添加学生操作为例,完整的代码流程如下(包含你的原有查询逻辑):

// 务必先开启会话
session_start();

// 校验管理员登录状态
if (!isset($_SESSION['username'])) {
    die('请先登录管理员账号!');
}

$auth = $_SESSION['username'];
// 数据库连接(替换成你的实际数据库信息)
$connection = mysqli_connect('localhost', '你的数据库用户名', '你的数据库密码', 'school_db');

// 检查数据库连接是否成功
if (!$connection) {
    die('数据库连接失败:' . mysqli_connect_error());
}

// 示例:处理添加学生的POST请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_student'])) {
    // 转义用户输入,防止SQL注入
    $student_name = mysqli_real_escape_string($connection, $_POST['student_name']);
    $c_id = mysqli_real_escape_string($connection, $_POST['c_id']);

    // 1. 执行添加学生的操作
    $add_query = "INSERT INTO school (c_id, student_name, auth) VALUES ('$c_id', '$student_name', '$auth')";
    if (mysqli_query($connection, $add_query)) {
        // 2. 学生添加成功后,写入操作日志
        $operation_type = '添加学生';
        $operation_content = "添加学生:姓名【{$student_name}】,班级ID【{$c_id}】";
        $log_query = "INSERT INTO operation_logs (operator, operation_type, operation_content) VALUES ('$auth', '$operation_type', '$operation_content')";
        mysqli_query($connection, $log_query);

        echo '学生添加成功,操作日志已记录!';
    } else {
        die('添加学生失败:' . mysqli_error($connection));
    }
}

// 你的原有查询逻辑:获取当前管理员操作过的学生记录
$query = "SELECT c_id, student_name, auth FROM school WHERE auth = '{$auth}'";
$send_q = mysqli_query($connection, $query);
if (!$send_q) {
    die('查询失败:' . mysqli_error($connection));
}

// 收集查询结果
$student_records = [];
while ($row = mysqli_fetch_assoc($send_q)) {
    $student_records[] = $row;
}

// 后续可以根据需求输出$student_records的数据

3. 关键优化建议

  • 更安全的SQL处理:推荐使用预处理语句替代直接拼接SQL,彻底避免SQL注入,比如日志插入可以改成:
$log_stmt = mysqli_prepare($connection, "INSERT INTO operation_logs (operator, operation_type, operation_content) VALUES (?, ?, ?)");
mysqli_stmt_bind_param($log_stmt, 'sss', $auth, $operation_type, $operation_content);
mysqli_stmt_execute($log_stmt);
  • 封装日志函数:把日志记录逻辑封装成一个独立函数,比如writeOperationLog($operator, $type, $content),后续所有需要记录日志的地方直接调用即可,减少重复代码
  • 丰富日志内容:如果是修改/删除操作,可以记录操作前后的数据对比,比如"修改学生张三的班级ID从101改为102",方便后续溯源排查

日志查询与展示示例

如果需要查看所有操作日志,可以写一个简单的查询展示代码:

// 查询所有日志,按操作时间倒序排列
$log_query = "SELECT * FROM operation_logs ORDER BY operation_time DESC";
$log_result = mysqli_query($connection, $log_query);

echo '<h3>系统操作日志</h3>';
echo '<table border="1" cellpadding="8">';
echo '<tr><th>日志ID</th><th>执行者</th><th>操作类型</th><th>操作详情</th><th>操作时间</th></tr>';
while ($log_row = mysqli_fetch_assoc($log_result)) {
    echo "<tr>";
    echo "<td>{$log_row['log_id']}</td>";
    echo "<td>{$log_row['operator']}</td>";
    echo "<td>{$log_row['operation_type']}</td>";
    echo "<td>{$log_row['operation_content']}</td>";
    echo "<td>{$log_row['operation_time']}</td>";
    echo "</tr>";
}
echo '</table>';

内容的提问来源于stack exchange,提问作者Alan Moe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:35:01