Codeigniter扩展数据库

时间:2011-10-19 13:44:42

标签: php codeigniter

我使用此示例扩展CI mysql驱动程序: http://codeigniter.com/wiki/Extending_Database_Drivers

它的工作非常好,实际上我只是遇到了一个奇怪的问题。当我尝试加载另一个配置数据库,如

$this->dbUsr = $CI->load->database(‘usuario’, TRUE);

这是我的扩展类mysql驱动程序,在其中我有一个名为insertSelect的函数,当我使用

$this->db->insertSelect()

系统找到该函数并执行它,但如果我尝试使用$this->dbUsr->insertSelect() 系统提示此错误:

Fatal error: Call to undefined method CI_DB_mysql_driver::insertSelect()

班级

<?php

class MY_DB_mysql_driver extends CI_DB_mysql_driver {

    public $CI;
    private $tabela;
    private $colunaai;
    private $where;

    function __construct($params) {
        parent::__construct($params);
        $this->CI =& get_instance();
        log_message('debug', 'Extended DB driver class instantiated!');
        echo 'MY_DB_mysql_driver<br/>';

    }



    /**
     * Função insere novos registros adicionando um contador a colunaai passada
     * nos parametros da funcao, deste modo é possível trabalhar com tabelas que
     * possuem chaves compostas.<br/>
     *
     * @param string $table
     * <p>A tabela o qual o método irá inserir um novo registro.</p>
     * @param array $data
     * <p>Array contendo todos dados que serão inseridos (Coluna de Auto-incremento tem que estar presente).</p>
     * @param string $colunaai
     * <p>Nome da coluna o qual o método irá incrementar o valor.</p>
     * @param array $where [Opcional]
     * <p>Array contendo os valores para a clausula que será montada(Usado somente em casos de chaves compostas).</p>
     * @return array resultado da query executada pelo método.
     * @access public
     */

    public function insertSelect($table, $data, $colunaai, $where = '') {
        $this->tabela = $table;
        $this->colunaai = $colunaai;
        $this->where = $where;

        $query = '';
        $driver = $this->CI->db->dbdriver;

        foreach ($data as $field => $value) {
            $fields[] = '`' . $field . '`';

            // Como parametro recebe a var colunaai, que no caso é a coluna do sistema de
            // autoincrement, caso a coluna seja igual a colunas o qual o array esta caminhando,
            // faz as validacoes para montar a clausula para autoincrement do campo
            if ($colunaai == $field) {

                // Valida o driver selecionado para montar o select de acordo com a sintaxe do SGBD selecionado
                // Monta o select para sintaxe do mysql
                if ($driver == 'mysql') {
                    $values[] = 'IfNULL(MAX(' . $colunaai . '),0) + 1';
                }

                // Monta o select para sintaxe do mssql server
                if ($driver == 'mssql') {
                    $values[] = 'ISNULL(MAX(' . $colunaai . '),0) + 1';
                }

                // Caso nao exista uma coluna definida para o autoincrement, ou caso ele n"ao seja encontrado no array
            } else {
                $values[] = "'" . mysql_real_escape_string($value) . "'";
            }
        }

        // Monta os valores separados por virgula
        $field_list = join(', ', $fields);
        $value_list = join(', ', $values);

        // Monta a estrutura do insert que sera executado
        $query = "
        INSERT INTO `" . $table . "` (" . $field_list . ")
        SELECT " . $value_list . "
        FROM `" . $table . "`";

        // Faz verificao para ver se existem valores para a clausula where
        if (!empty($where)) {

            $query .= 'WHERE ';
            $counter = 1;
            $sizearray = sizeof($where);

            // Percorre os elementos do array para adicionalos ao comando sql
            foreach ($where as $field => $value) {
                $query .= $field . ' = ' . $value;

                // Verifica quantos elementos existem no array, caso existam mais de uma acrescenta AND para a clausula
                if ($counter < $sizearray) {
                    $query .= ' AND ';
                }

                $counter++;
            }
        }

        // Volta para a classe o resultado do comnado sql executado
        return $this->CI->db->query($query);
    }

    public function lastInsert(){
        $colunaai = $this->colunaai;

        $this->CI->db->select($colunaai);
        $this->CI->db->order_by($colunaai, 'DESC');
        $query = $this->CI->db->get_where($this->tabela, $this->where);

        if ($query->num_rows > 0) {
            return $query->row()->$colunaai;
        }
    }

    public function errorHandling($number){

    }
}

?>  

1 个答案:

答案 0 :(得分:0)

您的致命错误表明您致电CI_DB_MYSQL_Driver而不是MY_DB_mysql_driver