首页 > 解决方案 > Codeigniter 如何使用钩子获取数据库错误并保存在日志表中?

问题描述

我需要将所有 PHP 和数据库错误保存在 codeigniter 的日志表中。为此,我正在尝试使用 codeigniter 中的钩子来做到这一点。这是我的代码。

钩子.php

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

Codeigniter 如何使用钩子获取数据库错误并保存在日志表中

我在 hooks 目录中创建了文件 db_log.php。这是我的代码。

<?php
class Db_log {
function __construct() {

    }

    function logQueries() {
        $CI = & get_instance();

        $times = $CI->db->query_times;    
         $error = $CI->db->error();
         print_r($error);

        // foreach ($CI->db->queries as $key => $query) 
        // { 
             // $sql = $query . " \n Execution Time:" . $times[$key]; 

        // }

    }
}

它正在显示所有查询,但在与数据库相关的任何错误时不起作用。我也尝试过 $CI->db->e​​rror() 来获取错误,但它不起作用。如果有任何与数据库相关的错误并且需要在自定义日志表中保存一个条目,我需要显示自定义消息。

尝试使用 shutdown_function

public function setHandler() {
        register_shutdown_function('handleShutdown');
    }

}

function handleShutdown() {

    print_r(error_get_last());



    if (($error = error_get_last())) {
        die("nnnnnnnnnnnnn");
        ob_start();
            echo "<pre>";
        var_dump($error);
            echo "</pre>";
        $message = ob_get_clean();
        //sendEmail($message);
        ob_start();
        echo '{"status":"error","message":"Internal application error!"}';
        ob_flush();
        exit();
    }
}

hooks.php

$hook['pre_system'][] = array(
'class' => 'PHPFatalError',
'function' => 'setHandler',
'filename' => 'PHPFatalError.php',
'filepath' => 'hooks'
);

标签: phpmysqlcodeigniter

解决方案


我认为这是不可能的 - 这是 CI < 4 的缺陷之一

问题出在他们的数据库驱动程序类中——如果您查看他们的display_error()函数,您会看到每次发生数据库错误时,整个应用程序都会立即停止。

但是,您可以尝试注册一个关闭功能并尝试在那里处理一些事情。

另一种方法是扩展 DB 驱动程序 - 为此您必须扩展加载程序。


推荐阅读