记录数据库上执行的活动的方法是什么?-MySQL / PHP

4
我决定在我的数据库中创建一个新表,用于审计对数据库执行的所有操作。
我的表“activity”相当简单,包含以下列:
- activity_id - 主键 - user_id - 用户的外键 - action - 执行的查询类型(SELECT、UPDATE、DELETE) - table - 受影响表的名称 - row - 受影响行的名称
目前我所做的是,当执行一个查询后,我紧接着再执行另一个查询,将信息插入到我的“activity”表中。
代码如下:
//query
$db->query("DELETE FROM foo WHERE id = '$foo->id'");
//activity record query
$db->query("INSERT INTO acitivity ( user_id, action, table, row ) VALUES ('$user->id', 'Deleted' , '$foo->id', 'foo')");

你可以看到,我需要为每个查询手动执行此操作,并且我的系统中有超过100个查询,我真的不想输入单独的查询来记录发生了什么。

我想知道MySQL中是否有任何功能可以告诉我已执行的操作,或者PHP中是否有任何库或技术可以帮助我?

还是说我注定要在我的系统中编写100个单独的查询?

谢谢


1
使用MySQL二进制日志记录几乎每个更改。 - hakre
3个回答

2
为您的表创建ON INSERT、ON UPDATE和ON DELETE触发器,将所有更改的详细信息写入审计活动表中。

1
如何将user_id分配给特定的审计。如果用户名称/用户ID被分配给记录,例如由用户xyz进行的插入,由abc进行的删除,由xyz进行的更新。因为登录表可能包含用户详细信息。如何将这些当前用户详细信息发送到ON INSERT、ON UPDATE、ON DELETE。 - Rohan Khude

1
你可以在你的类中创建一个新方法,比如说$db->ql()(来自query/log),它首先执行正常的查询,然后获取mysql_affected_rows()并进行一些操作。
insert into logs set when = now(), query_string = "{$query}", affected_rows = "{$affected_rows}"

这样,您将拥有完整的查询历史记录,不仅可以查看查询类型和执行的表格,还可以更详细地了解查询过程。

1
不应该将查询变量内联到 SQL 中,特别是那些内容像 $query 一样不可预测的变量。如果可能的话,请使用占位符;否则,请使用适当的“引号”机制来正确转义字符串。 - bart
@bart,你是正确的。在将$query插入到“logs”表之前,你应该使用mysql_real_escape_string()函数进行转义处理。 - Sorin Buturugeanu

1

创建触发器怎么样?

在PHP中进行审计并不是一个好主意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接