全局设置Codeigniter $ this->查询?

时间:2014-03-21 12:39:20

标签: php sql codeigniter

我正在使用CI网站,MS SQL数据库和CRUD操作要求我在实际运行操作之前运行一些查询。

$this->db->query('SET ANSI_NULLS ON;');
$this->db->query('SET QUOTED_IDENTIFIER ON;');
$this->db->query('SET CONCAT_NULL_YIELDS_NULL ON;'); 
$this->db->query('SET ANSI_WARNINGS ON;');
$this->db->query('SET ANSI_PADDING ON;');       

我想知道我是否可以种植这些植物以便它们always运行?

现在,我将它们放入我的模型中__construct()

2 个答案:

答案 0 :(得分:4)

您可以创建一个自定义模型类,然后可以在模型中进行扩展。

应用/核心/ MY_Model.php

class MY_Model extends CI_Model{

    function __construct(){
        parent::__construct();
        $this->db->query('SET ANSI_NULLS ON;');
        $this->db->query('SET QUOTED_IDENTIFIER ON;');
        $this->db->query('SET CONCAT_NULL_YIELDS_NULL ON;'); 
        $this->db->query('SET ANSI_WARNINGS ON;');
        $this->db->query('SET ANSI_PADDING ON;');
    }
}

应用/模型/ some_model.php

class Some_model extends MY_Model{

    function __construct(){
        parent::__construct();
    }

    function some_function(){
        //interact with db
    }
}

答案 1 :(得分:1)

您可以创建数据库驱动程序扩展,并将这些查询放在重写的查询方法中。您首先必须创建一个加载器扩展来实现这一点,因为codeigniter在加载时不会检查自定义DB_drivers。像这样:

在application / core / MY_Loader.php中创建一个文件

<?php

class MY_Loader extends CI_Loader {
/**
     * Database Loader
     *
     * @access    public
     * @param    string    the DB credentials
     * @param    bool    whether to return the DB object
     * @param    bool    whether to enable active record (this allows us to override the config setting)
     * @return    object
     */
    function database($params = '', $return = FALSE, $active_record = FALSE)
    {
            // Do we even need to load the database class?
            if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE)
            {
            return FALSE;
            }

            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.'libraries/'.$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;
            }
            // Grab the super object
            $CI =& get_instance();

            // Initialize the db variable.  Needed to prevent
            // reference errors with some configurations
            $CI->db = '';
            $CI->db = $db;
            // Assign the DB object to any existing models
            $this->_ci_assign_to_models();
    }
}

在application / core / MY_DB_mssql_driver中创建另一个文件:

<?php
class MY_DB_mssql_driver extends CI_DB_mssql_driver {

  function __construct($params){
    parent::__construct($params);
    log_message('debug', 'Extended DB driver class instantiated!');
  }

  function query($sql, $binds = FALSE, $return_object = TRUE){
     parent::query('SET ANSI_NULLS ON;');
     parent::query('SET QUOTED_IDENTIFIER ON;');
     parent::query('SET CONCAT_NULL_YIELDS_NULL ON;'); 
     parent::query('SET ANSI_WARNINGS ON;');
     parent::query('SET ANSI_PADDING ON;');

     return parent::query($sql, $binds, $return_object); 
  }

}

现在每次使用$this->db->query时,它都会调用这些查询。 但是,如果您不希望在每次查询调用时执行此操作,而不是覆盖query方法,请覆盖initialize方法,如:

function initialize(){
     if (parent::initialize() === TRUE) {
         parent::query('SET ANSI_NULLS ON;');
         parent::query('SET QUOTED_IDENTIFIER ON;');
         parent::query('SET CONCAT_NULL_YIELDS_NULL ON;'); 
         parent::query('SET ANSI_WARNINGS ON;');
         parent::query('SET ANSI_PADDING ON;');
     }
}