2009-03-11 49 views
31

database.php:CodeIgniter - Sử dụng nhiều cơ sở dữ liệu

$db['default']['hostname'] = "192.168.2.104"; 
$db['default']['username'] = "webuser"; 
$db['default']['password'] = "----"; 
$db['default']['database'] = "vad"; 
$db['default']['dbdriver'] = "mysql"; 
$db['default']['dbprefix'] = ""; 
$db['default']['pconnect'] = TRUE; 
$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['stats']['hostname'] = "192.168.2.104"; 
$db['stats']['username'] = "webuser"; 
$db['stats']['password'] = "---"; 
$db['stats']['database'] = "vad_stats"; 
$db['stats']['dbdriver'] = "mysql"; 
$db['stats']['dbprefix'] = ""; 
$db['stats']['pconnect'] = TRUE; 
$db['stats']['db_debug'] = TRUE; 
$db['stats']['cache_on'] = FALSE; 
$db['stats']['cachedir'] = ""; 
$db['stats']['char_set'] = "utf8"; 
$db['stats']['dbcollat'] = "utf8_general_ci"; 

Vấn đề là tôi chỉ có thể xác định trong cấu hình một $active_group, mặc định, hoặc số liệu thống kê. Tôi đã làm theo các tài liệu CodeIgniter và tôi thêm vào các điều sau đây:

$DB2 = $this->load->database('stats', TRUE); 

Bằng cách này tôi kết nối với cơ sở dữ liệu thứ hai, nhưng tôi mất kết nối với cơ sở dữ liệu thứ nhất. Có ai có bất kỳ ý tưởng về làm thế nào tôi có thể tải hai cơ sở dữ liệu mà không cần phải làm như sau trong tất cả các nhà xây dựng mô hình?

$database1 = $this->load->database('database1', TRUE); 
$database2 = $this->load->database('database2', TRUE); 

Kính trọng,

Pedro

Trả lời

24

Thay vì áp dụng bản hack như Camacho đã đề cập, bạn cũng có thể đặt cờ 'pconnect'-flag trong tệp database.php thành FALSE cho tất cả các kết nối.

+0

Tôi có bài viết về Tạo nhiều kết nối cơ sở dữ liệu trong ứng dụng CodeIgniter. Vui lòng xem và đưa ra gợi ý của bạn https://www.cloudways.com/blog/connect-multiple-databases-codeigniter/ –

4

tôi giải quyết vấn đề thay đổi DB_driver.php vào khuôn khổ.

Trong chức năng này, tôi thêm $this->db_select(); và bạn sẽ không bao giờ mất kết nối khi làm việc với 2 cơ sở dữ liệu.

function simple_query($sql) 
{ 
    if (! $this->conn_id) 
    { 
     $this->initialize(); 
    } 

    $this->db_select(); 

    return $this->_execute($sql); 
} 
5

hiện tại, người ký mã không thể kết nối với nhiều cơ sở dữ liệu trong kết nối liên tục. vì vậy, bạn nên bật các kết nối liên tục của mình. bạn có thể làm điều này ..

$db['default']['pconnect'] = FALSE; 

$db['stats']['pconnect'] = FALSE; 
+0

để chúng tôi có thể đề cập đến tên cơ sở dữ liệu trong chức năng db_select? –

3

Bạn có thể thử sửa đổi hàm CI_Session() trong tệp session.php.

Thay

$this->CI->load->database(); 

với điều này

$this->CI->db1 = $this->CI->load->database('default', TRUE); 
$this->CI->db2 = $this->CI->load->database('db2', TRUE); 

Bằng cách này, bạn không cần phải tải 2 dbs trong tất cả các tập tin mô hình nhưng phải sử dụng chúng trực tiếp sử dụng các đối tượng.

$ this-> db1 sẽ được truy cập vào nhóm mặc định db và $ this-> db2 sẽ được truy cập vào nhóm db2 db. (Cả hai nhóm db nên đã được quy định tại database.php)


Sundar

29

Có một lỗi trong CodeIgniter. Chèn một dòng vào một lớp sẽ sửa toàn bộ. Đây là nguồn gốc: http://koorb.wordpress.com/2007/11/16/codeigniter-connect-to-multiple-databases/

** sửa chữa này không áp dụng đối với PostgreSQL

Dưới đây là một bản sao chỉ trong trường hợp trang web đó đi xuống.

Số dòng đã thay đổi.Dưới đây là các bản vá lỗi từ CodeIgniter:

bắt đầu bugfix

Mô tả

tất cả các cuộc gọi cơ sở dữ liệu đi đến cơ sở dữ liệu tương tự (qua một khởi tạo)

Để khắc phục vấn đề thay đổi chức năng simple_query trong/hệ thống/cơ sở dữ liệu/DB_driver.php:

function simple_query($sql) 
{ 
    if (! $this->conn_id) 
    { 
     $this->initialize(); 
    } 

    $this->db_select(); //<----------------- Added this line 
    return $this->_execute($sql); 
} 

này hoàn toàn sửa chữa vấn đề, vì vậy bạn có thể làm những thứ như thế này trong một mô hình

$this->legacy_db = $this->load->database('legacy', true); 
+0

CodeIgniter vẫn hiển thị lỗi không thể sử dụng này trong tháng 10 năm 2013 và bản sửa lỗi này không hoạt động. –

+0

Nếu bạn đang bắt đầu một dự án mới, tôi có thể đề nghị sử dụng FuelPHP. Rất nhiều người cùng viết CodeIgniter đã chuyển sang viết lại hoàn toàn và suy nghĩ lại về CodeIgniter. Nếu bạn đang sử dụng dự án cũ hoặc ứng dụng khách của bạn yêu cầu CodeIgniter, bản sửa lỗi này sẽ hoạt động. Nhưng nếu bạn tìm cách khác để sửa chữa nó, hãy chia sẻ ở đây. Cảm ơn! – mrbinky3000

+0

Điều này vẫn áp dụng cho CI (phiên bản 2.1.3) và tốt hơn nhiều so với việc gọi thủ công db_select() mỗi lần. –

1

Bạn không cần tạo cấu hình cơ sở dữ liệu riêng nếu bạn chỉ cần sử dụng cơ sở dữ liệu khác trên cùng một kết nối. Bạn có thể chuyển sang cơ sở dữ liệu khác khi cần, như sau:

$ this-> db-> db_select ($ database2_name);

CodeIgbiter User Guide

Các vấn đề liên quan