PHP CI框架使用多個數據庫

今天在做單元測試時發現要操作遠程的數據庫,所以就在論壇裏找了相關的帖子。但發現問的人挺多的,但回答最多的就是查看手冊:http://codeigniter.org.cn/user_guide/database/connecting.html。手冊上好象講的也挺清楚的。但自己做的時候也有不明白。所以在此將自已的心得拿來分享一下,和大家一起學習!

進入正題:
       第一步:創建數據庫
       現在假設我要操作的兩個數據庫分別爲我本機MySQL數據庫中的test數據庫和test_other數據庫。
       test數據庫中有一個t_news表(新聞表);

       其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語句如下:

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  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 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, 下載次數: 129) 


原文鏈接:http://codeigniter.org.cn/forums/thread-13287-1-1.html

發佈了164 篇原創文章 · 獲贊 1 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章