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){
}
}
?>
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的致命错误表明您调用的是
CI_DB_MYSQL_Driver
而不是您的MY_DB_mysql_driver
Your fatal error shows that you call
CI_DB_MYSQL_Driver
not yourMY_DB_mysql_driver