如何从两个不同数据集的表执行两条SELECT语句并关联user_id实现审核日志记录
解决方案
1. 单独执行两条SELECT获取结果
你可以直接分别执行两条查询语句获取独立的结果集,注意你原写法里存在两处问题:一是NOT user_id= 'user_id'是写死的字符串值,不符合业务筛选逻辑;二是直接拼接$admin_id变量到SQL会有SQL注入风险,推荐用预处理语句实现,PHP示例如下:
// 查询用户表,排除指定user_id $userStmt = $pdo->prepare("SELECT * FROM users_account WHERE user_id != ?"); $userStmt->execute([$toBeExcludedUserId]); $userResult = $userStmt->fetchAll(PDO::FETCH_ASSOC); // 查询管理员表,排除指定admin_id $adminStmt = $pdo->prepare("SELECT * FROM super_admin WHERE id != ?"); $adminStmt->execute([$adminId]); $adminResult = $adminStmt->fetchAll(PDO::FETCH_ASSOC);
执行完成后$userResult和$adminResult就是两个表的查询结果。
2. 关联表实现审核日志展示需求
前置准备:新增审核日志表
你需要额外新建一张审核操作日志表,存储管理员的审核行为记录,建表SQL参考:
CREATE TABLE audit_log ( log_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '日志主键', user_id VARCHAR(64) NOT NULL COMMENT '被审核用户ID,关联users_account.user_id', admin_id INT UNSIGNED NOT NULL COMMENT '操作管理员ID,关联super_admin.id', audit_result TINYINT NOT NULL COMMENT '审核结果:1=通过,2=拒绝', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', FOREIGN KEY (user_id) REFERENCES users_account(user_id), FOREIGN KEY (admin_id) REFERENCES super_admin(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关联查询获取带管理员信息的审核记录
需要展示审核日志时,用JOIN关联三张表即可同时拿到用户信息、管理员身份信息:
SELECT al.created_at AS audit_time, al.audit_result, ua.user_id, ua.user_fullname, ua.user_email, sa.username AS admin_name FROM audit_log al LEFT JOIN users_account ua ON al.user_id = ua.user_id LEFT JOIN super_admin sa ON al.admin_id = sa.id ORDER BY al.created_at DESC;
审核操作写入流程
管理员执行审核操作时,同步更新用户状态和写入日志即可,建议加事务保证数据一致性:
// 从登录态获取当前操作的管理员ID $currentAdminId = $_SESSION['super_admin_id']; // 接收参数:被审核用户ID、审核结果 $auditedUserId = $_POST['user_id']; $auditResult = $_POST['result']; $pdo->beginTransaction(); try { // 更新用户审核状态 $updateUser = $pdo->prepare("UPDATE users_account SET isApproved = ? WHERE user_id = ?"); $updateUser->execute([$auditResult, $auditedUserId]); // 写入操作日志 $addLog = $pdo->prepare("INSERT INTO audit_log (user_id, admin_id, audit_result) VALUES (?, ?, ?)"); $addLog->execute([$auditedUserId, $currentAdminId, $auditResult]); $pdo->commit(); } catch (\Exception $e) { $pdo->rollBack(); // 自定义异常处理逻辑 }
注意事项
- 不要使用
SELECT *查询全字段,密码等敏感字段禁止带出,避免信息泄露 - 所有涉及变量传入的SQL都必须用预处理语句,杜绝SQL注入风险
- 多表写操作务必加事务,避免出现数据不一致问题
内容的提问来源于stack exchange,提问作者user17122787
相关产品推荐
相关产品推荐

