我正在寻找一种为我的表制作简单事件日志的方法。我有几个表可以由不同的用户更改,我想跟踪:
- 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,主要)
- 创建日期(日期时间)
- user_id (int)
- 表名(小文本)
- 记录 ID(整数)
- 单元格名称(小文本)
- action_type(小文本)
- 旧值(文本)
- 新值(文本)
之后,编写函数。我还没有写“插入”和“删除”部分,但我认为我应该更容易。
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'
希望这会有所帮助。它现在进行了测试并且可以正常工作。如果有更新 - 我会在这里发布。