Drupal7串連多個資料庫及常見問題解決_php執行個體

來源:互聯網
上載者:User

如果你遇到這些問題:
1.Drupal如何串連到多個資料庫?
2.Drupal串連到多個資料庫後,但是發現程式報錯,這是怎麼了?
3.Drupal擷取、添加、修改、刪除多個資料庫時,資料沒有正確的寫入資料庫或者讀取到空的資料,怎麼解決?
4.只想在Drupal某個函數調用或控制其他資料庫,但是失敗了?
請認真看看後面的介紹,並如何解決你的問題。
一、Drupal如何串連到多個資料庫?
允許Drupal串連多個資料庫,需要轉換$db_url為數組。
預設串連單個資料庫的URL格式(字串):

複製代碼 代碼如下:
$db_url = 'mysql://username:password@localhost/databasename';
$db_url = 'mysqli://username:password@localhost/databasename';
$db_url = 'pgsql://username:password@localhost/databasename';

支援多個資料庫的URL格式(數組):

複製代碼 代碼如下:
$db_url['default'] = 'mysql://drupal:drupal@localhost/drupal';
$db_url['mydb'] = 'mysql://user:pwd@localhost/anotherdb';
$db_url['db3'] = 'mysql://user:pwd@localhost/yetanotherdb';

當查詢一個不同的資料庫時,簡單地將資料庫通過$db_url的引用鍵設定為當前活動的資料庫,即可使用。

複製代碼 代碼如下:
<?php
db_set_active('mydb');
db_query('SELECT * FROM table_in_anotherdb');
// 當資料擷取完成後,切換回預設的資料庫連接。
db_set_active('default');
?>

這是Drupal的資料庫操作的基本操作。

二、Drupal串連到多個資料庫後,但是發現程式報錯,這是怎麼了?

連結到多個資料庫時出現報錯,主要可能以下原因:

1.串連到其他資料庫時,SQL出錯了,這個是人為的代碼錯誤;
2.串連資料庫時交叉了,所以在其他資料庫裡找不到資料表,即使SQL正確,也要報錯;

解決方案:
針對第一種情況,請根據SQL報錯,來修改SQL語句,就解決了。
第二種情況,請檢查資料庫連接是否交叉了,意思就是本來想調用另外資料庫的資料表,但是資料庫連接已經換到其他地方了。關於資料庫連接交叉,請仔細檢查db_set_active這個函數之後的SQL語句,是否在active資料庫裡。

三、Drupal擷取、添加、修改、刪除多個資料庫時,沒有正常工作?

1、在Drupal中SQL語句可以不帶資料表的首碼,只需要用大括弧{}包含table就可以在資料庫操作時加上資料表的首碼。
例如:db_query('SELECT * FROM {table_in_anotherdb}');
但是一個資料庫使用者,如果擁有多個資料庫的許可權時,可以不用在$db_url設定串連到資料庫,直接在當前資料庫連接上操作就行了。
設定$db_prefix來實現跨資料庫操作:

複製代碼 代碼如下:

$db_prefix = array(
    'default' => ”,
    'authmap' => 'z_',
    'profile_fields' => 'usertable.z_',
    'profile_values' => 'usertable.z_',
    'users_roles' => 'usertable.z_',
    'users_fields' => 'usertable.',
    'role' => 'usertable.z_',
    'sessions' => 'usertable.z_',
    'users' => 'usertable.z_',
);

上面的代碼作用時,當前Drupal的使用者等資訊全部使用usertable,這樣多個Drupal就可以共用一個使用者資訊資料庫usertable,其中z_代表資料表的首碼。

注意:

a).users表用於存在Drupal使用者的基本資料,可以儲存所有使用者共用的UID及其基本欄位;
b).sessions表用於存放Drupal使用者Sessions,可以統計所有網站的線上使用者量;
c).role表用於存放所有Drupal站的角色;
d).users_roles存放所有Drupal站的許可權;
通過上面的$db_prefix可以全域設定使用那個表要用到那個資料庫,以及那個表的首碼,這個只是方便在Drupal的SQL語句中使用標準的{table}。

2、如果不通過$db_prefix來設定,那麼最直白的方法就是直接把資料庫 表名在SQL語句中。

例如:

複製代碼 代碼如下:

db_query("SELECT uid FROM test.z_table1 WHERE name = '%s' and pass = '%s'", $name, md5($pass));

上面的SQL語句直接定位到test資料庫,z_table資料表。
所以當你遇到Drupal擷取、添加、修改、刪除多個資料庫時,資料沒有正確的寫入資料庫或者讀取到空的資料,請明確你所控制的資料庫、資料表位置是否正確。


四、在Drupal某個函數調用或控制其他資料庫

請看下面的function架構代碼:

複製代碼 代碼如下:

function test_fuc() {
  global $db_url; //擷取全域變數
  $db_url['db_logs'] = 'mysqli://username:password@localhost/databasename';
  db_set_active('db_logs');
  $codehere; // 此處放置操作db_logs資料庫連接的SQL
  db_set_active('default');
}

特別要主要,$db_url是全域變數,需要在局部函數中用global引用:
複製代碼 代碼如下:
global $db_url; //擷取全域變數

設定完資料庫後,記得使用db_set_active('default');,設定資料庫連接恢複到預設。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.