我可以在控制器中更改每种方法的数据库配置吗?
$db['default']['db_debug'] = TRUE;
默认值为TRUE
,而我需要在某种方法中将其设为false以捕获错误并执行其他操作(例如显示404页面)。
当我尝试$this->config->load('database')
时,它失败了。
另一个问题:
我可以查看不正确的查询并将其捕获到某些变量,而不是将其显示给用户,而不是将db_debug
配置设置为FALSE
吗?
答案 0 :(得分:15)
我检查了system / database / DB_Driver的代码,发现:
$this->db->db_debug = FALSE;
将在我的控制器中工作,以便即时启用/禁用调试功能。
答案 1 :(得分:3)
扩展comenk的答案,您可以扩展数据库类并实现各种方法来实现您的目标。
首先,您需要通过创建MY_Loader.php
文件扩展核心Loader类
class MY_Loader extends CI_Loader
{
function __construct()
{
parent::__construct();
}
/**
* Load the Standard and/or Extended Database function & Driver class
*
* @access public
* @return string
*/
function database( $params = '', $return = FALSE, $active_record = NULL )
{
$ci =& get_instance();
if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($ci->db) AND is_object($ci->db))
{
return FALSE;
}
$my_db = config_item('subclass_prefix').'DB';
$my_db_file = APPPATH.'core/'.$my_db.EXT;
if(file_exists($my_db_file))
{
require_once($my_db_file);
}
else
{
require_once(BASEPATH.'database/DB'.EXT);
}
// Load the DB class
$db =& DB($params, $active_record);
$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;
}
// Initialize the db variable. Needed to prevent
// reference errors with some configurations
$ci->db = '';
$ci->db = $db;
}
}
通过实施上述功能,您可以创建一个MY_DB_mysqli_driver.php
,其中mysqli
将替换为您在CI database.php配置中使用的任何驱动程序。
此时您需要添加comenk对MY_DB_mysqli_driver.php
function debug_on() {
return $this->db_debug = TRUE;
}
function debug_off() {
return $this->db_debug = FALSE;
}
function in_error() {
return (bool) $this->_error_number();
}
然后在你的模型/控制器中,
$this->db->debug_off();
$this->db->query('SELECT * FROM `table`');
if( $this->db->in_error() ) {
show_404();
}
$this->db->debug_on();
答案 2 :(得分:1)
您必须在system / database / DB_driver.php上添加功能
function debug_on()
{
$this->db_debug = TRUE;
return TRUE;
}
function debug_off()
{
$this->db_debug = FALSE;
return FALSE;
}
之后,您只需执行此命令即可在运行时更改
$this->db->debug_off();
$this->db->reconnect();
答案 3 :(得分:1)
$ this-> db-> db_debug = 0; // 0:关闭,1:开启 那对我而言...... 您可以查看$ GLOBALS变量以找到此通用设置。
答案 4 :(得分:0)
要隐藏用户的错误SQL(以及其他错误),您需要设置php错误报告级别。 CodeIgniter基本上处于开发模式。
转到index.php并替换此
error_reporting(E_ALL);
用这个
error_reporting(0);
这是快速完成的方法。您也可以使用钩子实现此功能,因此您不必触摸CI文件。您还可以向该挂钩添加逻辑,以便它只在生产服务器上设置它。
对于调试SQL,您可以创建一个继承自CI_Model的类,然后创建所有模型类以扩展该类。在该类中,您可以添加用于运行查询的代码,这些查询将查询写入日志,以便您可以更轻松地调试它们。如果查询本身不好,这将无济于事,但您应该能够在达到这一点之前弄明白。