萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> Drupal7連接多個數據庫及常見問題解決

Drupal7連接多個數據庫及常見問題解決

 這篇文章主要介紹了Drupal7連接多個數據庫的方法、操作實例,以及常見問題解決方法,需要的朋友可以參考下

如果你遇到這些問題: 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');,設置數據庫連接恢復到默認。
copyright © 萬盛學電腦網 all rights reserved