【问题标题】:CodeIgniter hook not catching insert/update queriesCodeIgniter 钩子没有捕获插入/更新查询
【发布时间】:2015-02-03 14:17:16
【问题描述】:

我正在尝试使用post_systempost_controller 挂钩来捕获和记录数据库表中的所有插入和更新查询。但是,$queries = $CI->db->queries; 语句似乎根本没有捕获任何插入或更新语句。即使在各自的视图/控制器中插入新数据或更新旧数据时,它也只会捕获 SELECT 语句。

这是我的相关代码:

hooks.php

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

// also tried with post_controller hook
$hook['post_system'] = array(
    'class' => 'Db_query_log', 
    'function' => 'log_db_queries', 
    'filename' => 'db_log.php', 
    'filepath' => 'hooks'        
);

hooks/db_log.php

    <?php

class Db_query_log {

    function __construct() {
        //nothing special    
    }

    function log_db_queries() {
        $CI = & get_instance();
        $queries = $CI->db->queries;

        foreach ($queries as $key => $query) {
            echo $query . "<br>"; 
        // all statements displayed are SELECT statements even for UPDATE and INSERT operations performed by controllers where data is actually changed 
        }
    }

}

这里的罪魁祸首可能是什么?我是否遗漏了什么,或者这个钩子只是忽略了 INSERT/UPDATE 操作?

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: php codeigniter codeigniter-hooks


    【解决方案1】:

    使用post_controller 代替post_system

    $hook['post_controller'] = array(
        'class' => 'Db_query_log', 
        'function' => 'log_db_queries', 
        'filename' => 'db_log.php', 
        'filepath' => 'hooks'        
    );
    

    【讨论】:

    • 它没有任何区别。它仍然没有捕获任何插入/更新查询。
    • 它对我有用,我刚刚尝试了你的代码,它工作得很好。
    • 什么可能会阻止我的 codeigniter 实例获取 INSERT/UPDATE 查询,有什么建议/想法?
    • 我认为是重定向,在保存方法之后
    • 如果您想记录所有查询,我认为更好的方法是覆盖您正在使用的数据库驱动程序中的查询方法。
    【解决方案2】:

    要实现这一点,请打开任何帮助文件并将此代码放在底部

    function log_que($sql) {
            $filepath = APPPATH . 'logs/Query-log-' . date('Y-m-d') . '.php';   
                $handle = fopen($filepath, "a+");
                fwrite($handle, $sql." \n Execution Time: ".date("Y-m-d H:i:s")."\n\n");  
                fclose($handle);   
    }
    

    在此之后转到 system/database/DB_driver.php 并找到名为“query”的函数 并将下面的代码放在函数的顶部。

    log_que($sql);'
    

    然后所有查询将保存在 application/logs 文件夹内的文件中。

    如果您只想保存特定查询,您可以设置 if 条件。喜欢

    if(preg_match('/INSERT/',$sql)) {
     fwrite($handle, $sql." \n Execution Time: ".date("Y-m-d H:i:s")."\n\n");  
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      相关资源
      最近更新 更多