【问题标题】:Using hooks to create database log使用钩子创建数据库日志
【发布时间】:2012-03-06 19:49:01
【问题描述】:

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

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 的信息,但它似乎不适用于数据库操作,仅适用于控制器和系统。有没有办法使用钩子或有更好的解决方案?

提前感谢您的帮助。

对不起,描述太长了,我不善言辞。

【问题讨论】:

  • 你可以使用钩子——如果它是一个后钩子,那么我认为你仍然可以访问 CI 对象——你在使用 $ci = get_instance();在你的钩子里?如果它是预系统挂钩,则 CI 对象尚不可用,因此您必须使用 PDO 或其他方法以老式方式进行。
  • 谢谢@Stevo,在没有post action的情况下,hook 处理不了对吧?
  • 不确定您所说的“不是发布操作”是什么意思。
  • 如果用户想删除一些东西,我会给他一个链接,它会调用删除函数,所以,这不是一个发布操作,是吗?对于帖子,我知道这是通过表单发送的内容

标签: php codeigniter hook


【解决方案1】:

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] 类代码,然后在控制器构造函数中调用该库。在库中,您可以修改窃取的分析器代码以获取查询和其他数据并存储到数据库(也是用户数据的 CI 超级对象)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多