php - codeigniter - pyrocms 拦截并修改所有查询;扩展事件记录

标签 php codeigniter activerecord

除了修改 DB_active_record.php 之外,有没有办法在发送到数据库之前捕获所有查询并修改它们?这将是理想的,但如果它是唯一的选择,我不反对修改这个文件。

我可以直接从模型中调用这些东西,但如果这是在后台完成的事情会感觉更好,这样就不会忘记它发生的时间和地点;最好在后台完成。

我正在使用一个库来加密查询数据。在 lib 中,我正在检查某些 key 是否不加密,因此这不仅仅是加密所有数据的问题,而是每个查询中的一些数据。

例如,像这样修改insert():

function insert($table = '', $set = NULL)
{
    if ( ! is_null($set))
    {
        $this->CI =& get_instance();
        $this->CI->load->library('my_encrypt');
        $set = $this->CI->my_encrypt->encrypt_query($set);
        $this->set($set);
    }

在发送到数据库之前正确加密数据。但是,这对更新/设置或解密没有任何作用。

有没有办法设置一个中间人或其他东西作为模型和事件记录之间的中间人,我可以在将相关数据发送到 AR 或返回模型之前加密和解密相关数据?

谢谢。


更新:

所以按照下面的指南,我能够让它工作。我正在使用 pyroCMS(版本 1.3.2 社区;CI 版本 2.0.2),它已经完成了一些工作。

这是我做的。

system/cms/core/MY_Loader.php extends MX_loader extends CI_Loader;所以 MX_Loader 是需要修改的。


system/cms/libraries/MX/Loader.php

public function database() 更改为:

public function database($params = '', $return = FALSE, $active_record = NULL) {
    log_message('debug', 'db loader from MX/Loader');

    // Grab the super object
    $CI =& get_instance();

    // Do we even need to load the database class?
    if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db)) {
        return FALSE;
    }

    require_once(BASEPATH.'database/DB'.EXT);

    // Load the DB class
    $db =& DB($params, $active_record);

    //get the driver name, set its path and load er up
    $my_driver = config_item('subclass_prefix').'DB_'.$db->dbdriver.'_driver';
    $my_driver_file = APPPATH.'core/'.$my_driver.EXT;

    if (file_exists($my_driver_file)) {
        require_once($my_driver_file);
        $db = new $my_driver(get_object_vars($db));
    }

    if ($return === TRUE) {
        return $db;
    }

    CI::$APP->db = DB($params, $active_record);
    return CI::$APP->db;
}

此处与已接受答案中链接的文章的重要区别在于 db vars 的设置,因为 pyro 与常规 CI 不同。

然后在system/cms/core中添加自定义的驱动文件MY_DB_mysql_driver.php。然后将加载这些方法,这些方法将在所有模型中可用。此外,此处使用与 DB_active_rec.php 中相同名称的方法将优先。例如在 MY_DB_mysql_driver.php 中添加 insert 方法将覆盖 DB_active_rec.php 中的插入方法。

最佳答案

默认情况下,您不能扩展事件记录类。但是,您可以扩展加载器类数据库调用后扩展事件记录类以允许它:

此处的说明和代码:http://www.simonemms.com/code/extending-the-codeigniter-database-class/

关于php - codeigniter - pyrocms 拦截并修改所有查询;扩展事件记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174942/

相关文章:

php - 创建富文本编辑器界面

php - 代码点火器 : vcf mime type not detected in mac safari

ruby-on-rails - 用于删除反斜杠的 Postgres 命令在控制台中有效,但不适用于 ActiveRecord::Base.connection.execute

javascript - 使内容展开为空的 div

php - 敏捷并行数据库迁移

php - PHP(已弃用)mysql 模块与 MySQLi 和 PDO 的漏洞

php - 在 php 中从一行创建动态数据透视列

php - 将单个或多个 URI 段传递给函数(代码点火器)

ruby-on-rails - 选择总是返回 :id even if it is not included in the call

ruby-on-rails - 如何使用 ActiveRecord 模型创建 'OR' 条件