Codeigniter 扩展数据库

发布于 2024-12-10 12:22:50 字数 4885 浏览 0 评论 0原文

我使用这个例子来扩展 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){

    }
}

?>  

Im using this example to extend CI mysql driver:
http://codeigniter.com/wiki/Extending_Database_Drivers

And its working really well, actually i just had a strange problem. When i try to load another config database like

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

Here is my extended class of mysql driver, inside it i have an function called insertSelect, when i use

$this->db->insertSelect()

the system find the function and execute it, but if i try to use $this->dbUsr->insertSelect()
the system prompt this error:

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

The class

<?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){

    }
}

?>  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

终陌 2024-12-17 12:22:50

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

Your fatal error shows that you call CI_DB_MYSQL_Driver not your MY_DB_mysql_driver

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文