Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql(几乎)完成审计_Php_Mysql_Audit_Auditing - Fatal编程技术网

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'
    的内容,并使用它)
  • 只要插入、更新和删除后有触发器,获取上一个/下一个值就是一个简单的查询,我只存储旧值
简而言之,对于包含colun(a,b,c)的表,我将创建一个包含列(user_id,modtime,a,b,c)的表

主要缺点:

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

总而言之,这对我来说似乎很好,但我在实践中很少看到它不好的原因,所以我将等待这些答案。

首先感谢你的回答。我认为你指出了我研究中的一个突破。我不知道用户定义变量!用户定义变量和下面的文章可能是完美的答案是:好的,我想到了一个很好(但速度较慢)的解决方案。-请参阅下面关于触发的用户的一些信息。请参阅:获取
UPDATE checktable SET name='barbara', description='new name' WHERE id='1' AND name='barbi'