使用钩子创建数据库日志

时间:2012-03-06 19:49:01

标签: php codeigniter hook

我必须在我的日志表上记录每个数据库操作,这是表:

log_id - INT
user_id - INT
table - VARCHAR(45)
date - INT
action - ENUM('INSERT','DELETE','UPDATE')
new_value - VARCHAR(255)
old_value - VARCHAR(255)

如果一个用户创建一个新的博客帖子,例如,我必须保存用户id,该对象将被插入的表,日期,动作将是“INSERT”,new_value将被php对象序列化, old_value将为空。

在更新的情况下,我需要使用新对象保存new_value但在此之前我需要保存当前值,也在old_value列上序列化。

在删除的情况下,我需要将序列化对象保存在old_value列上,并将new_value保留为空。

我正在阅读CI Hooks,但它似乎不适用于数据库操作,仅适用于控制器和系统。有没有办法使用钩子或有更好的解决方案?

提前感谢您的帮助。

对于长篇描述感到抱歉,我的言语不好。

1 个答案:

答案 0 :(得分:2)

1

您可以扩展db驱动程序类,以拦截对db的所有查询。您可以获取CI超级对象以获取用户信息。然后,您可以修改类以执行常规数据库工作,还可以存储查询/数据库中的任何其他内容。

codeigniter - pyrocms intercept and modify all queries; extending active record

http://codeigniter.com/wiki/Extending_Database_Drivers

优点:

- 背景操作;透明地发生 - 现有构造函数无需修改

2

另一种选择(较少的工作,更多的工作)是创建一个库并窃取一堆profiler [system / library / Profiler.php]类代码,并在你的控制器中调用库构造函数。在库中,您可以修改被盗的分析器代码以获取查询和其他数据并存储到db(同样,CI超级对象用于用户数据)。

优点:
- 如果需要,可以从控制器发送其他数据(例如,在控制器构造函数中调用时可以将params发送到库方法)

缺点:
-Gotta改变那些构造函数!