gpt4 book ai didi

php - mysql(几乎)完成审计

转载 作者:可可西里 更新时间:2023-11-01 08:56:46 25 4
gpt4 key购买 nike

我正在寻找一种为我的表制作简单事件日志的方法。我几乎没有可以由不同用户更改的表,我想跟踪:

- 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(整数)
  • 表名(小文本)
  • record_id (int)
  • 单元格名称(小文本)
  • action_type (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);

}
}

和:

function log_updates($action_type, $table, $values, $parameters){
$where = " WHERE ";
$user_id = '1234'; //example
foreach ($parameters as $key => $value){
$where .= $key."='";
$where .= $value."' AND ";
}
unset($value);

$where = substr($where, 0, -4);

foreach ($values as $key => $value){
$result = mysql_query("SELECT $key, id FROM $table $where");

$row = mysql_fetch_row($result);
$old_value = $row[0];
$record_id = $row[1];

if ($action_type == 'UPDATE'){
if ($old_value != $value){
$logger = mysql_query("INSERT INTO auditing (event_date, action_type, user_id, table_name, record_id, cell_name, old_value, new_value)
VALUES (NOW(), '$action_type', $user_id, '$table', '$record_id', '$key', '$old_value', '$value')");
if (!$logger) echo mysql_error();
}
}


}
unset($value);

}

要调用您需要的函数,您首先需要对参数进行排序以查找特定行,并将新值放入数组中,然后调用 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'

希望对您有所帮助。它现在进行了测试并且可以工作。如果有更新 - 我会在这里发布。

audit - after the change

最佳答案

嗯,我也在想这个。

  • 每个表都有一个表来保持修订对我个人来说不是什么大问题,但是嘿。
  • 我相信用户名可以与用户定义的变量一起保存,(在 session 开始后发出类似 SET @user='someone' 的东西,并使用它。
  • 只要在 INSERT、UPDATE 和 DELETE 之后有触发器,获取上一个/下一个值是一个简单的查询,我将只存储旧值。

简而言之,对于包含列 (a,b,c) 的表,我会创建一个包含列 (user_id,modtime,a,b,c) 的表。

主要缺点:

  • 批量更新缓慢(因此请仔细选择您的表格以保持修订)
  • 数据复制豪华版,你/我必须有足够的存储空间
  • “相关”数据不会触发修订(即:更改 group_members 表并不会真正更改 groups 表,而您可能希望将其保留为groups 的时间点,而不是深入研究 group_members 变更。

总而言之,这对我来说似乎很划算,但由于我很少在实践中看到它,因此必须有令人信服的理由说明它不好,所以我会等待这些答案。 p>

关于php - mysql(几乎)完成审计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com