我使用此示例扩展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){
}
}
?>
答案 0 :(得分:0)
您的致命错误表明您致电CI_DB_MYSQL_Driver
而不是MY_DB_mysql_driver