如何在执行删除操作前插入记录(日志记录)?SQL PDO PHP环境
PHP PDO 删除操作前插入日志记录实现方案
核心思路
利用PDO的事务机制,将插入日志和删除数据两个操作绑定为原子操作:要么两个操作都成功执行,要么全部回滚,避免出现日志已插入但删除失败,或者删除成功却没留下日志的情况。
整合后的完整代码
<?php // 初始化PDO连接,开启异常模式以便事务处理 $dsn = 'mysql:host=localhost;dbname=your_db;charset=utf8mb4'; $username = 'your_username'; $password = 'your_password'; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 开启异常错误模式 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]; try { $pdo = new PDO($dsn, $username, $password, $options); $pdo->beginTransaction(); // 开启事务 // 1. 先插入删除日志 $userId = $_GET['id']; // 假设要删除的记录ID来自请求参数 $logStmt = $pdo->prepare("INSERT INTO delete_logs (target_id, deleted_at, operator) VALUES (?, NOW(), ?)"); // 可补充操作人信息,比如当前登录用户ID,示例用固定值演示 $logStmt->execute([$userId, 'admin']); // 2. 执行删除操作 $deleteStmt = $pdo->prepare("DELETE FROM your_table WHERE id = ?"); $deleteStmt->execute([$userId]); $pdo->commit(); // 提交事务,两个操作都生效 echo "删除成功,日志已记录"; } catch (PDOException $e) { $pdo->rollBack(); // 出错时回滚所有操作 die("操作失败: " . $e->getMessage()); } ?>
关键注意事项
- 开启PDO异常模式:必须设置
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,操作出错时会抛出异常,才能触发事务回滚。 - 事务的原子性:通过
beginTransaction()开启事务,所有操作完成后用commit()提交,出错则用rollBack()回滚,保证日志和删除操作的一致性。 - 日志信息完整性:日志表建议包含被删除数据的标识、删除时间、操作人信息,可选存储被删除数据的快照,方便后续溯源。
内容的提问来源于stack exchange,提问作者bricas30
相关产品推荐
相关产品推荐

