2011-01-29 11 views
9

Tôi đang viết một lớp bao bọc cho trang 7 của tôi cho phép tôi kết nối và truy vấn cơ sở dữ liệu phpbb của mình.Nhiều kết nối cơ sở dữ liệu đồng thời trong drupal 7

Khi kết nối với nguồn dữ liệu ngoài (theo tài liệu drupal) bạn đã đặt db hoạt động, chạy truy vấn, sau đó đặt db hoạt động trở lại mặc định.

ví dụ:

db_set_active('phpbb'); 
$result = db_query($sql,$args,$opts);        
db_set_active();//back to default 

Nhưng có cách nào để sử dụng cơ sở dữ liệu wrapper drupal để tạo ra một kết nối hoàn toàn mới mà có thể được đặt vĩnh viễn thành cơ sở dữ liệu mới mà không cần phải làm chuyển đổi này back-và-ra vô nghĩa? chắc chắn chúng ta có thể xử lý các kết nối tới nhiều cơ sở dữ liệu đồng thời.

Tôi đã thực hiện một số googling nhưng không tìm thấy bất kỳ ai đang cố gắng làm điều này như được nêu ra.

Trả lời

12

Điển hình. 5 phút sau khi đăng bài, tôi sẽ tìm ra ... vì vậy, đối với các nhà cung cấp trong tương lai:

Về cơ bản, bạn không sử dụng db_query, thay vào đó bạn chạy truy vấn trên kết nối của mình mà không cần đặt liên kết hoạt động.

bạn có thể con số này ra bằng cách nhìn vào cách db_query hoạt động: http://api.drupal.org/api/drupal/includes--database--database.inc/function/db_query/7

Vì vậy, nó trông như thế này:

$target='default'; 
$key = 'phpbb'; 
$phpbb = Database::getConnection($target,$key); 
$result = $phpbb->query($sql,$args,$opts); 

này giả định bạn có một cơ sở dữ liệu cấu hình trong tập tin settings.php như sau :

$databases['phpbb']['default'] = array(
    'driver' => 'mysql', 
    'database' => 'forum', 
    'username' => 'username', 
    'password' => 'password', 
    'host' => 'mysql.host.com', 
    'prefix' => 'phpbb3_' 
); 
+0

http://drupal.org/node/18429 cũng có một số ví dụ mã, đặc biệt nếu bạn muốn định cấu hình cài đặt cơ sở dữ liệu động, nghĩa là, không được mã hóa cứng trong settings.php. Ví dụ, nếu bạn lưu trữ các thiết lập cơ sở dữ liệu ở một nơi nào đó khác với trong settings.php, bạn có thể tự động tạo mảng và sử dụng Database :: addConnectionInfo() để tạo kết nối cơ sở dữ liệu. – sillygwailo

+6

'$ phpbb = Cơ sở dữ liệu :: getConnection ($ target = 'default', key = 'phpbb');' đây là một lỗi mà tôi thấy theo thời gian và tôi đang thua lỗ như thế nào mọi người có thể đến một mã như vậy . Những gì bạn muốn là '$ phpbb = Database :: getConnection ('mặc định', 'phpbb');' lý do duy nhất mà mã của bạn làm việc là biểu thức '$ target = 'default'' đánh giá là' default', tuy nhiên biến đó ' $ target' trong phạm vi * người gọi * thay đổi thành ''default'' có thể không được ghi nhận. – chx

+0

@chx Đồng ý - Trả lời cập nhật :) – thtas

1

Database::addConnectionInfo() có lẽ?

Phương pháp này cho phép thêm thông tin xác thực kết nối mới tại thời gian chạy là . Trong các trường hợp bình thường, cách ưu tiên để chỉ định thông tin đăng nhập cơ sở dữ liệu là thông qua settings.php. Tuy nhiên, phương pháp này cho phép chúng được thêm vào vào các thời điểm tùy ý, chẳng hạn như trong khi kiểm tra đơn vị, khi kết nối với cơ sở dữ liệu do bên thứ ba xác định, v.v.

Nếu cặp khóa/đích đã cho tồn tại, phương pháp này sẽ bị bỏ qua.

0

Định nghĩa cho getConnection trích dẫn thứ tự khác nhau cho các đối số hơn được sử dụng ở trên.

function getConnection($target = 'default', $key = NULL) 

Đây là buồn bã khác nhau từ cơ sở dữ liệu :: addConnectionInfo() mà là

public static function addConnectionInfo($key, $target, $info) 

Ngoài ra, trên DB_select, các $ key không phải là một tham số, mặc dù nó là trong mảng lựa chọn:

function db_select($table, $alias = NULL, array $options = array()) { 
    if (empty($options['target'])) { 
    $options['target'] = 'default'; 
    } 
    return Database::getConnection($options['target'])->select($table, $alias, $options); 
} 

khi

final public static function getConnection($target = 'default', $key = NULL) { 

do đó, điều này ngụ ý rằng 'master' hoặc 'slave' hoặc 'default' luôn được sử dụng như là thiết lập, nhưng không phải là khóa cho cơ sở dữ liệu/lược đồ thay thế, yêu cầu db_set_active ('...'); và db_set_active(); xung quanh db_select.

Vì các cuộc gọi đến các dbs khác có thể dễ dàng được yêu cầu trong quá trình xử lý db_select (chẳng hạn như cuộc gọi devel hoặc cuộc gọi thay đổi), đây là thiết kế không linh hoạt. Thay đổi cuộc gọi này:

return Database::getConnection($options['target'])->select($table, $alias, $options); 

để thêm thông số khóa (tham số đã là tham số !!) là cần thiết nhưng không đủ cho đến giờ tôi có thể thấy.