Php mysql(几乎)完成审计
我正在寻找一种为我的表创建简单事件日志的方法。我有几个可以由不同用户更改的表,我希望跟踪:Php mysql(几乎)完成审计,php,mysql,audit,auditing,Php,Mysql,Audit,Auditing,我正在寻找一种为我的表创建简单事件日志的方法。我有几个可以由不同用户更改的表,我希望跟踪: - who made the change - when - what was before update - what is the new value - which table and which record & column 像这样的事情会很好: 20:00:00 | john | update | products | 113 | product_name | "xbox" | "
- who made the change
- when
- what was before update
- what is the new value
- which table and which record & column
像这样的事情会很好:
20:00:00 | john | update | products | 113 | product_name | "xbox" | "xbox 360"
20:00:10 | jim | update | products | 113 | product_name | "xbox 360" | ""
20:01:00 | jim | delete | products | 113
所以我读到触发器可能是答案,但据我所知,似乎我需要为我想要跟踪的每一列创建一个完整的新表。触发器对于这个工作来说并不完美,因为我想记录是谁做了更改,从我所读到的来看,这是不可能的
我考虑为CRUD创建3个不同的函数(插入、更新、删除),在进行查询之前,检查所做的更改,创建日志,然后运行查询。但从这里看来,这似乎是非常缓慢和复杂的
还有更好的办法吗
谢谢
好的,我再次检查了触发器,它不是我想要的,所以我编写了简单的函数,它将检查您想要记录的每个查询的新值是否不同,如果是,它将记录它 主要的问题是,我没有测量它,但它显然慢了 首先,您需要创建一个新的mysql表,如下所示:
- id(a_i,主要)
- 创建日期(日期时间)
- 用户id(int)
- 表名称(tinytext)
- 记录id(int)
- 单元名称(tinytext)
- 动作类型(tinytext)
- 旧值(文本)
- 新_值(文本)
function log_query($action_type, $table, $values, $parameters){
if ($action_type == 'UPDATE'){
log_updates($action_type, $table, $values, $parameters);
$query = "UPDATE $table SET ";
foreach ($values as $key => $value){
$query .= $key."='";
$query .= $value."', ";
}
unset($value);
$query = substr($query, 0, -2);
$query .= ' WHERE ';
foreach ($parameters as $key => $value){
$query .= $key."='";
$query .= $value."' AND ";
}
unset($value);
$query = substr($query, 0, -4);
$result = mysql_query($query);
}
}
以及:
要调用函数,首先需要对参数进行排序以查找特定行,并将新值放入数组,然后调用log_query函数:
$update = Array('name' => 'barbara', 'description' => 'new name');
$parameters = Array('id' => '1', 'name' => 'barbi');
log_query('UPDATE', 'checktable', $update, $parameters);
这实际上将检查“名称”是否已更改以及描述是否已更改。对于每一条,如果它发生更改,它将在“审计”表中插入新记录,指定确切的更改。
登录更改后,它将运行更新查询。在我们的例子中:
UPDATE checktable SET name='barbara', description='new name' WHERE id='1' AND name='barbi'
希望这有帮助。它现在已经测试过了,并且可以正常工作。如果有更新,我会在这里发布
嗯,我也在想这个
- 对于我个人来说,每个表都有一个表来保存修改不会有太大问题,但是嘿
- 我相信用户名可以与用户定义的变量一起保存(在会话开始后发布类似于
的内容,并使用它)SET@user='someone'
- 只要插入、更新和删除后有触发器,获取上一个/下一个值就是一个简单的查询,我只存储旧值
- 批量更新速度慢(因此请选择表以仔细保存修订)
- 数据复制豪华版,您/我必须有足够的存储空间
- “相关”数据不会触发修订(即:更改
表不会真正更改组成员
表,而您可能希望将其作为组
的时间点,而不是深入研究组
的更改组成员
总而言之,这对我来说似乎很好,但我在实践中很少看到它不好的原因,所以我将等待这些答案。首先感谢你的回答。我认为你指出了我研究中的一个突破。我不知道用户定义变量!用户定义变量和下面的文章可能是完美的答案是:好的,我想到了一个很好(但速度较慢)的解决方案。-请参阅下面关于触发的用户的一些信息。请参阅:获取
UPDATE checktable SET name='barbara', description='new name' WHERE id='1' AND name='barbi'