【问题标题】:Codeigniter extend databaseCodeigniter 扩展数据库
【发布时间】:2011-12-10 22:58:49
【问题描述】:

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

    }
}

?>  

【问题讨论】:

  • 哪个错误? dbUser 来自哪里?你能发布一些更相关的代码吗?
  • 在我的 mysql_driver 扩展类中,我创建了一个名为 public dbUsr 的属性,每次我需要获取用户数据库时,我只需访问它。
  • @Damien 我用更多有用的信息更新了我的问题。

标签: php codeigniter


【解决方案1】:

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

【讨论】:

  • 我可能是错的,但如果你调用 $CI->load->database('usuario', TRUE);,那么 CI_DB... 驱动程序将被加载,而不是你的 MY_DB.. 。 司机。无论如何 user973254 是对的,您的扩展类不是加载的类...
猜你喜欢
  • 2015-01-22
  • 2021-02-18
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多