校园系统管理员操作日志实现需求及代码咨询
校园管理系统操作日志实现方案与代码优化
看起来你已经迈出了第一步——获取当前登录管理员的用户名,不过代码片段没写完,我来帮你完善整套操作日志的实现逻辑,确保每一项关键操作都能清晰记录执行者和操作详情。
核心思路
- 每次执行添加/修改/删除学生、系统配置变更等关键操作时,先获取当前登录管理员的身份(你已经通过
$_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
相关产品推荐
相关产品推荐

