用户
 找回密码
 入住 CI 中国社区
搜索
查看: 14579|回复: 17
收起左侧

[已解决] CI连接多个数据库 怎么实现?--很着急。。。在线等。

  [复制链接]
发表于 2010-11-22 17:00:48 | 显示全部楼层 |阅读模式
本帖最后由 cmsphp 于 2010-11-23 11:11 编辑

项目已经做好,目前所有程序都是利用默认连接的数据库
$active_group = "default";
$active_record = TRUE;
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "123456";
$db['default']['database'] = "news";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE ;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

现在要开发一个新程序要在这个框架上加一个数据库
就是怎么实现连接多个数据库
要实现的是默认不指定连接哪个数据库的时候连接的是news数据库
当需要连接新数据库的时候指定news_1
怎么写配置文件
怎么写模型和控制器
我的代码贴出来:
database.php

PHP复制代码
 
//默认的
$active_group = "default";
$active_record = TRUE;
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "123456";
$db['default']['database'] = "news";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE ;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
//新数据库
//默认的
$active_group = "baike";
$active_record = TRUE;
$db['baike']['hostname'] = "localhost";
$db['baike']['username'] = "root";
$db['baike']['password'] = "123456";
$db['baike']['database'] = "baike";
$db['baike']['dbdriver'] = "mysql";
$db['baike']['dbprefix'] = "";
$db['baike']['pconnect'] = TRUE;
$db['baike']['db_debug'] = FALSE ;
$db['baike']['cache_on'] = FALSE;
$db['baike']['cachedir'] = "";
$db['baike']['char_set'] = "utf8";
$db['baike']['dbcollat'] = "utf8_general_ci";
 
复制代码

模型demo_model.php

PHP复制代码
<?php
class demo_model extends Model {
 
 var $title = '';
 var $content = '';
 var $date = '';
 
 function apidemo_modelmodel() {
  // Call the Model constructor for PHP4
  parent::Model ();
  $DB1 = $this->load->database('default', TRUE);
  $DB2 = $this->load->database('baike', TRUE);
 }
 
 //获取
 function get_baike_info($id) {
  $query = $DB2->query ( "SELECT * FROM web_baike  "  );
  return $query->row_array ();
 }
 //获取
 function get_information_info($id) {
  $query = $DB1->query ( "SELECT * FROM web_information "  );
  return $query->row_array ();
 }
 
}
/* End of file api_model.php */
/* Location: /application/models/demo_model.php */
复制代码


控制器ontrollers/demo.php
PHP复制代码
 
<?php
class demo extends Controller {
 
 function demo() {
  parent::Controller ();
  $this->load->model ( 'demo_model' );
  $this->load->helper ( array ('form', 'url', 'cookie' ) );
 }
 
 function index() {
  $baike_info = $this->demo_model->get_baike_info ( 1 );
  $information_info = $this->demo_model->get_information_info ( 1 );
  print_r($baike_info);
  print_r($information_info);
 }
}
/* End of file index.php */
/* Location: /application/controllers/demo.php */
?>
 
复制代码




报错信息:
Fatal error: Call to a member function query() on a non-object in \system\application\models\demo_model.php on line 17
 楼主| 发表于 2010-11-22 17:13:14 | 显示全部楼层
唉,基础知识,变量作用域
你在function a()里面定义的$DB1,$DB2
在function b()里面是木有滴
要用$this->D ...
visvoy 发表于 2010-11-22 17:10



    Fatal error: Call to a member function query() on a non-object in system\application\models\demo_model.php on line 17
发表于 2010-11-22 17:06:37 | 显示全部楼层
 楼主| 发表于 2010-11-22 17:08:10 | 显示全部楼层
visvoy 发表于 2010-11-22 17:06



    大哥 我就是看了手册写的 还是有问题啊
发表于 2010-11-22 17:10:15 | 显示全部楼层
唉,基础知识,变量作用域
你在function a()里面定义的$DB1,$DB2
在function b()里面是木有滴
要用$this->DB1=$this->load->xxx
发表于 2010-11-22 17:28:06 | 显示全部楼层
回复 5# cmsphp


    你这个确实是变量作用域问题,请不要定义成局部变量,而要定义成类属性。
请注意 http://codeigniter.org.cn/user_guide/database/connecting.html 里提到的一个注意事项:
译注:要连接多个数据库请先设置 config/database.php 中的 $db['xxxxxx']['pconnect'] = FALSE; 这是 mysql_pconnect() 造成的问题,和 CI 无关。
如果你都符合上面的条件,肯定是没问题的,这个都测试过了。
 楼主| 发表于 2010-11-22 17:40:10 | 显示全部楼层
回复  cmsphp


    你这个确实是变量作用域问题,请不要定义成局部变量,而要定义成类属性。
请注意  里 ...
Hex 发表于 2010-11-22 17:28



  可以给出一个演示系统代码吗?
发表于 2010-11-22 20:08:34 | 显示全部楼层
回复 7# cmsphp


    把你的 $DB 都改成 $this->DB 就 OK,替换就行。
然后注意要关闭 pconnect,这个很重要,这是 PHP 本身的问题,和 CI 无关。
 楼主| 发表于 2010-11-23 11:08:26 | 显示全部楼层
本帖最后由 cmsphp 于 2010-11-23 11:09 编辑
回复  cmsphp


    把你的 $DB 都改成 $this->DB 就 OK,替换就行。
然后注意要关闭 pconnect,这个很重 ...
Hex 发表于 2010-11-22 20:08


PHP复制代码
<?php
class demo_model extends Model {
 
 var $title = '';
 var $content = '';
 var $date = '';
 
 function apidemo_modelmodel() {
  // Call the Model constructor for PHP4
  parent::Model ();
  $DB1 = $this->load->database('default', TRUE);
  $DB2 = $this->load->database('baike', TRUE);
 }
 
 //获取
 function get_baike_info($id) {
  $query = $this->DB2->query ( "SELECT * FROM web_baike  "  );
  return $query->row_array ();
 }
 //获取
 function get_information_info($id) {
  $query = $this->DB1->query ( "SELECT * FROM web_information "  );
  return $query->row_array ();
 }
 
}
/* End of file api_model.php */
/* Location: /application/models/demo_model.php */
复制代码


PHP复制代码
//默认的
$active_group = "default";
$active_record = TRUE;
 
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "123456";
$db['default']['database'] = "news";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = FALSE ;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
 
//新的
$active_group = "baike";
$active_record = TRUE;
 
$db['baike']['hostname'] = "localhost";
$db['baike']['username'] = "root";
$db['baike']['password'] = "123456";
$db['baike']['database'] = "baike";
$db['baike']['dbdriver'] = "mysql";
$db['baike']['dbprefix'] = "";
$db['baike']['pconnect'] = FALSE;
$db['baike']['db_debug'] = FALSE ;
$db['baike']['cache_on'] = FALSE;
$db['baike']['cachedir'] = "";
$db['baike']['char_set'] = "utf8";
$db['baike']['dbcollat'] = "utf8_general_ci";
 
复制代码




还是报错

Fatal error: Call to a member function query() on a non-object in  system\application\models\demo_model.php on line 17
发表于 2010-11-23 11:24:50 | 显示全部楼层
-_-
$DB1 = $this->load->database('default', TRUE);
$DB2 = $this->load->database('baike', TRUE);
这两句也要改。。。
建议好好看看 PHP 基本语法。

本版积分规则