我试图在我的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类并获取数据库的正确方法是什么?我应该以另一种方式进行吗?
答案 0 :(得分:1)
用户@DFriend在this question中声明:
如果您需要访问其他内容,则扩展CI_Log将不起作用 库。原因是CI_Log是在创建$ CI之前很久创建的 所以没有“实例”可供& get_instance()返回。
$ this->加载不起作用,因为$ this不是控制器($ this和 $ CI指向同一个对象)并且类加载('CI_Loader')没有 已创建。
我正在进行的方式看起来不像是要走的路。由于扩展CI_Log类作为核心类本身的修改具有明显的局限性。
目前,由于这是一个时间修改,我将继续覆盖CI_Log类并使用纯PHP来完成任务。