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

CI中使用多个数据库

[复制链接]
发表于 2012-5-31 20:57:35 | 显示全部楼层 |阅读模式
本帖最后由 fltn03 于 2012-5-31 21:13 编辑

       今天在做单元测试时发现要操作远程的数据库,所以就在论坛里找了相关的帖子。但发现问的人挺多的,但回答最多的就是查看手册:http://codeigniter.org.cn/user_guide/database/connecting.html。手册上好象讲的也挺清楚的。但自己做的时候也有不明白。所以在此将自已的心得拿来分享一下,和大家一起学习!

进入正题:
       第一步:创建数据库
       现在假设我要操作的两个数据库分别为我本机MySQL数据库中的test数据库和test_other数据库。
       test数据库中有一个t_news表(新闻表);
       其SQL语句如下:
      
SQL复制代码
 
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test`;
/*Table structure for table `t_news` */
DROP TABLE IF EXISTS `t_news`;
CREATE TABLE `t_news` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '新闻ID',
  `title` CHAR(255) NOT NULL COMMENT '新闻标题',
  `sub_title` VARCHAR(500) DEFAULT NULL COMMENT '新闻副标题',
  `content` TEXT COMMENT '新闻内容',
  `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  `hits` INT(11) DEFAULT NULL COMMENT '点击率',
  `author` CHAR(50) DEFAULT NULL COMMENT '作者',
  `source` CHAR(255) DEFAULT NULL COMMENT '信息来源',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='新闻表';
复制代码

       test_other数据库中有一个t_sys_user(系统管理员表);
       其SQL语句如下:
      
SQL复制代码
 
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test_other` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test_other`;
/*Table structure for table `t_sys_user` */
DROP TABLE IF EXISTS `t_sys_user`;
CREATE TABLE `t_sys_user` (
  `id` INT(11) NOT NULL COMMENT '管理员ID',
  `role_id` INT(11) NOT NULL COMMENT '角色ID',
  `login_name` VARCHAR(50) NOT NULL COMMENT '用户名称',
  `password` VARCHAR(255) NOT NULL COMMENT '密码',
  `is_admin` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否为管理员(0:否 1:是)',
  `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  `last_login` DATETIME DEFAULT NULL COMMENT '上次登录时间',
  `login_num` INT(11) DEFAULT '0' COMMENT '登录次数',
  `last_ip` CHAR(15) DEFAULT NULL COMMENT '上次登录IP',
  `status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '登录状态(0:未登录 1:已登录)',
  `is_locked` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否被锁定(0:否 1:是 注:锁定时不允许登录)',
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='系统管理员表';
复制代码
      第二步:修改数据库配置信息
       打开./application/config/目录中的database.php文件,在原来的内容中增加另外一个数据库配置信息。文件内容如下:
      
PHP复制代码
 
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the 'Database Connection'
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
*/

 
$active_group = 'default';
$active_record = TRUE;
 
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '111111';
$db['default']['database'] = 'test';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
 
//Additional database
$db['additional']['hostname'] = 'localhost';
$db['additional']['username'] = 'root';
$db['additional']['password'] = '111111';
$db['additional']['database'] = 'test_other';
$db['additional']['dbdriver'] = 'mysql';
$db['additional']['dbprefix'] = '';
$db['additional']['pconnect'] = FALSE;
$db['additional']['db_debug'] = TRUE;
$db['additional']['cache_on'] = FALSE;
$db['additional']['cachedir'] = '';
$db['additional']['char_set'] = 'utf8';
$db['additional']['dbcollat'] = 'utf8_general_ci';
$db['additional']['swap_pre'] = '';
$db['additional']['autoinit'] = TRUE;
$db['additional']['stricton'] = FALSE;
 
/* End of file database.php */
/* Location: ./application/config/database.php */
复制代码


       第三步:编写控制器
       在./application/controllers/目录下创建名为dbc.php的控制器文件,其内容如下:
      
PHP复制代码
 
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * @package                CI2.1.0
 * @author                  Longde
 * @version                 1.0
 */

 
// ------------------------------------------------------------------------
header('Content-Type:text/html; charset=utf-8');
/**
 * 数据库控制器
 * 该控制器的主要做用是进行数据库方面的操作。
 *
 * @category        Controllers
 * @author                Longde
 */

class Dbc extends CI_Controller {
       
        /**
         * 测试在同一个项目中同时使用多个数据库进行操作
         * @access        public
         * @return        array
         */

        public function index()
        {
                //按照CI手册中的说法:如果需要同时连接多个数据库,则采用
                //$DB1 = $this->load->database('group_one',TRUE);
                //$DB2 = $this->load->database('group_two',TRUE);
                //注意:confing/database.php中的$db[xxxx]['pconnect'] = FALSE
                $db1 = $this->load->database('default',TRUE);//注意第一个参数:值与配置文件中的第一个索引对应
                $db2 = $this->load->database('additional', TRUE);//注意第一个参数:值与配置文件中的第一个索引对应
               
                //下面开始进行操作
                //首先,在第一个数据库test的t_news表中插入数据
                $data1 = array(
                        'title'                        => '测试在CI框架中同时操作多个数据库',
                        'sub_title'                 => 'CI框架允许使用多个数据库进行操作。具体的内容请查看CI手册......',
                        'content'                  => '如果你需要同时连接多于一个的数据库,你可以用以下方式来实现:$DB1 = $this->load->database(\'group_one\', TRUE);$DB2 = $this->load->database(\'group_two\', TRUE);注意:改变 "group_one" 和 "group_two" 为你指定了连接属性的组名 (或者通过上边说过的连接数组的数组名)。',
                        'create_time'            => date('Y-m-d H:i:s'),
                        'author'                    => 'Longde',
                        'source'                    => '原创'
                );
                //插入之前先判断是否已存在
                $db1->select('id');
                $id1 = $db1->get_where('t_news',array('title' => $data1['title']))->result_array();
                if(empty($id1))
                {
                        //插入数据
                        $db1->insert('t_news',$data1);
                        //获取刚才插入数据时生成的ID值
                        $id1 = $db1->insert_id();
                }
                else
                {
                        $id1 = $id1[0]['id'];
                }
                //从数据库中读取数据
                $result1 = $db1->get_where('t_news',array('id' => $id1))->result_array();
                //格式化输出刚才的读取结果
                echo "<pre>";
                print_r($result1);
               
                //其次,在第二个数据库test_other的t_sys_user表中插入数据
                $data2 = array(
                        'role_id'                     => 1,
                        'login_name'             => 'admin',
                        'password'                => md5('admin'),
                        'is_admin'                  => 1,
                        'create_time'             => date('Y-m-d H:i:s'),
                        'status'                      => 0,
                        'is_locked'                 => 0
                );
                //插入之前先判断是否已存在
                $db2->select('id');
                $id2 = $db2->get_where('t_sys_user',array('login_name' => $data2['login_name']))->result_array();
                if(empty($id2))
                {
                        //插入数据
                        $db2->insert('t_sys_user',$data2);
                        //获取刚才插入数据时生成的ID值
                        $id2 = $db2->insert_id();
                }
                else
                {
                        $id2 = $id2[0]['id'];
                }
                //从数据库中读取刚才插入的数据
                $result2 = $db2->get_where('t_sys_user',array('id' => $id2))->result_array();
                //格式化输出刚才的读取结果
                echo "<pre>";
                print_r($result2);
        }
       
        // ------------------------------------------------------------------------
}
 
/* End of file dbc.php */
/* Location: ./application/controllers/dbc.php */
复制代码


       说明一下,dbc.php文件中的index()方法主要是对两个数据库分别进行了插入操作,但在插入操作之前,先对该条记录是否存在进行了判断,如果存在则不进行插入操作并直接查询出结果;否则先进行插入,然后再查询。
       值得注意的是,数据库配置文件database.php文件中的$db['group_name']['pconnect']值需要设置为FALSE,其次$db['group_name']中的索引group_name对应的就是“$DB1 = $this->load->database('group_name',TRUE)”;
       如果文件保存完成后,通过站点访问即可看到查询出来的数据则说明多个数据库操作实现成功。以为本机的虚拟域名(http://ci.xx/)为例,直接访问http://ci.xx/dbc即可看到结果。
       以上信息有不正确的地方希望和位给予指正!
        附上脚本: multiple_db.rar (4.67 KB, 下载次数: 156)


发表于 2012-12-27 23:04:52 | 显示全部楼层
{:soso_e182:}
发表于 2013-1-24 14:53:52 | 显示全部楼层
收藏了~
发表于 2013-2-18 18:28:20 | 显示全部楼层
正好用到
发表于 2014-11-6 20:18:14 | 显示全部楼层
正好遇到这方面的问题啊!只是不知道你这个能不能帮我提供一些解决思路?顶!
发表于 2016-5-24 20:06:27 | 显示全部楼层
不需要关闭吗?

本版积分规则