如何在CodeIgniter中发生致命错误后操纵数据库?

时间:2017-11-16 11:00:04

标签: php codeigniter

我试图在我的Codeigniter中存储不同类型的错误和奇怪的行为。对于这些不是一个例外我想存储PHP致命错误也。为了存档,我采用了这种方式:

创建名为MY_Log的CI_Log类的覆盖,并将其存储在application / core中。 该类中的代码如下所示:

class MY_Log extends CI_Log {

    public function __construct(){

        parent::__construct();

    }

    function write_log($level = 'error', $msg, $php_error = FALSE){

        $result = parent::write_log($level, $msg, $php_error);

        if((require_once APPPATH.'libraries/Utils.php')== TRUE){
            if ($result == TRUE && strtoupper($level) == 'ERROR') {

                $utils = new Utils();
                $message = "An error occurred: \n\n";
                $message .= $level.' - '.date($this->_date_fmt). ' --> '.$msg."\n";
                $utils->log_petition_if_required(date("Y-m-d H:i:s", time() + 86400), 0, "", 500, $message);
            }
        }


        return $result;

    }
}

此类实际上正确地缓存了错误,并将功能重定向到了' Utils'图书馆恰到好处。 库中的代码如下所示:

class Utils
{
    protected $CI;

    public function __construct()
    {
        $this->CI =& get_instance();
    }
    public function log_petition_if_required($date_log, $user_id, $post_data, $http_code, $output){

        $date_now = date("Y-m-d H:i:s");
        if(!empty($date_log) && $date_log>$date_now)
        {
            $url = $_SERVER['HTTP_HOST'].str_replace('/index.php','',$_SERVER['PHP_SELF']).'?'.$_SERVER['QUERY_STRING'];

            $insert_data = [
                'user_id' => $user_id,
                'date' => $date_now,
                'url' => $url,
                'post_data' => $post_data,
                'status' => $http_code,
                'response' => $output
            ];

            $sql = 'INSERT INTO activity_log (user_id, activity_date, url, post_data, http_code, response) VALUES (?,?,?,?,?,?)';

            //This condition is my futile intent of loading the database functionality and everything seems to work as expected till this point
            if(empty($this->CI)){
                $this->CI = & get_instance();
                $this->CI->load->database();
            }

            $query = $this->CI->db->query($sql, $insert_data);
        }
    }
}

所以我在log_petition_if_required函数的最后几行遇到问题,加载数据库功能并执行查询。

目前收到此错误:

  

致命错误:在非对象中调用成员函数database()   C:\ wamp \ www \ appname \ application \ libraries \ Utils.php在线   $this->CI->load->database();

在这种情况下调用Loader类并获取数据库的正确方法是什么?我应该以另一种方式进行吗?

1 个答案:

答案 0 :(得分:1)

用户@DFriend在this question中声明:

  

如果您需要访问其他内容,则扩展CI_Log将不起作用   库。原因是CI_Log是在创建$ CI之前很久创建的   所以没有“实例”可供& get_instance()返回。

     

$ this->加载不起作用,因为$ this不是控制器($ this和   $ CI指向同一个对象)并且类加载('CI_Loader')没有   已创建。

我正在进行的方式看起来不像是要走的路。由于扩展CI_Log类作为核心类本身的修改具有明显的局限性。

目前,由于这是一个时间修改,我将继续覆盖CI_Log类并使用纯PHP来完成任务。