欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

drupal6 drupal7 d6 d7 多个数据库的连接 有大用

shiping1 的头像

在Drupal中使用多个数据库连接

分享到:

老葛的Drupal培训班 Think in Drupal

数据库抽象层给我们带来了多项好处,比如函数名称更好记了,查询中内置了安全特性,等等。有时候,我们需要连接到第3方或者遗留的数据库上,如果Drupal的数据库API能满足这一需要并同时提供安全特性的话,那该多美啊。不错,我们可以实现这一点!例如,在你的模块中,你可以连接到一个非Drupal的数据库,并从中取出数据。
 
在settings.php文件中,$db_url既可以是一个字符串(通常是这样的),也可以是包含多个数据库连接的字符串数组。下面是默认的语法,声明了一个单独的连接:
$db_url = 'mysql://username:password@localhost/databasename';
 
当使用一个数组时,它的键就是在激活数据库连接时所引用的简洁名称,而它的值就是连接的字符串本身。下面是一个例子,在这里我们声明了两个连接字符串, default(默认的)和legacy(遗留的):
 
$db_url['default'] = 'mysql://user:password@localhost/drupal6';
$db_url['legacy'] = 'mysql://user:password@localhost/legacydatabase';
 
注意 Drupal本身使用的数据库一定要以default为键。
 
    当你需要连接到Drupal中其它的数据库上时,你首先使用它的键名激活该连接,当你使用完连接时,将它切换回到默认的连接上。
 
// Get some information from a non-Drupal database.
db_set_active('legacy');
$result = db_query("SELECT * FROM ldap_user WHERE uid = %d", $user->uid);
 
// Switch back to the default connection when finished.
db_set_active('default');
 
注意 切记一定要切换回到默认的连接上,这样Drupal可以干净的完成整个请求生命周期并重新回到自己的表中。
 
    由于数据库抽象层设计的是为每个数据库使用相同的函数名,所以不能够同时使用多个数据库后台(比如,同时使用MySQL 和 PostgreSQL)。然而,在同一个站点还是可以同时使用MySQL 和 PostgreSQL连接的,如何实现的更多详细,请参看http://drupal.org/node/19522

Drupal连接多个数据库与数据操作

  • Drupal如何连接到多个数据库?

  • Drupal连接到多个数据库后,但是发现程序报错,这是怎么了?

  • Drupal获取、添加、修改、删除多个数据库时,数据没有正确的写入数据库或者读取到空的数据,怎么解决?

  • 只想在Drupal某个函数调用或控制其他数据库,但是失败了?

基于同一套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连接到多个数据库后,但是发现程序报错,这是怎么了?

链接到多个数据库时出现报错,主要可能以下原因:

  • 连接到其他数据库时,SQL出错了,这个是人为的代码错误;

  • 连接数据库时交叉了,所以在其他数据库里找不到数据表,即使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_代表数据表的前缀。

 

注意:

  • users表用于存在Drupal用户的基本信息,可以存储所有用户共用的UID及其基本字段;

  • sessions表用于存放Drupal用户Sessions,可以统计所有站点的在线用户量;

  • role表用于存放所有Drupal站的角色;

  • 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’);,设置数据库连接恢复到默认。

如果你在使用过程中仍然存在问题,请在评论中写下,我会尽力帮助你解决!

查看更多: Drupal连接多个数据库与数据操作 | LixiPHP - 专注于建设高品质网站! http://blog.lixiphp.com/drupal-multiple-databases/#ixzz2gBAm6pii

来自 http://blog.lixiphp.com/drupal-multiple-databases/#axzz2gB95cGTm

 

http://blog.lixiphp.com/drupal-multiple-databases/#axzz2gB95cGTm

 

Drupal7 如何连接到多个数据库

尽管数据库抽象层使得函数名更容易记住,也内置了安全查询。有时,我们需要连接到第三方或遗留的数据库,使用Drupal的数据库API即可满足这样的需求,也可获得安全查询的好处。例如,你的模块可以连接到非Drupal的数据库,并返回数据。


在settings.php文件,$databases是一个由多个数据库连接字符串组成的数组。
下面是单个连接的默认语法:

array(
    'driver' => 'mysql',
    'database' => 'databasename',
    'username' => 'username',
    'password' => 'password',
    'host' => 'localhost',
    'port' => 3306,
    'prefix' => 'myprefix_',
  );
 
作为一个例子,你可能有两个数据库,默认的数据库(在这个例子中假设为D7)和遗留的数据库。
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$databases = array (
  'default' => 
  array (
    'default' => 
    array (
      'driver' => 'mysql',
      'database' => 'd7',
      'username' => 'username',
      'password' => 'userpassword',
      'host' => 'localhost',
      'port' => '',
      'prefix' => '',
    ),
  ),
  'legacy' =>
  array (
    'default' =>
    array (
      'driver' => 'mysql',
      'database' => 'legacydatabase',
      'username' => 'legacyusername',
      'password' => 'legacyuserpassword',
      'host' => '122.185.22.1',
      'port' => '6060',
    ),  
  ),
);

注意:您的Drupal网站使用的数据库应始终使用 default作为键。

当您在Drupal中,要连接到其他数据库时,可以使用它的键名激活它;处理完成后要切换回默认的数据库连接:

// 从非 Drupal 数据库中获取数据
db_set_active('legacy'); 
$result = db_query("SELECT * FROM ldap_user WHERE uid = :uid", array(':uid' => $user->uid)); 
 
// 完成后切换为默认的连接 
db_set_active('default');

注意事项:当您切换到其他的数据库连接,尝试进行t(“text”)这样的操作时会导致错误。 t() 函数要求默认的数据库为激活状态。因此,一定要尽可能快地切换为默认的数据库连接,并特别注意在请求数据库开启时,不要调用代码。


由于数据库抽象层设计为不同的数据使用相同的函数名,因此多种类型的数据库(例如,MySQL和PostgreSQL)不能同时使用。然而,访问 http://drupal.org/node/19522 可以了解如休在一个网站中同时连接到MySQL和PostgreSQL。

来自 http://www.cuitu.net/book/drupalru-he-lian-jie-dao-duo-ge-shu-ju-ku

 

drupal7 多个数据库的连接  不指定

drupal水滴 , 2011/10/23 16:49 , drupal建站 » drupal数据库 , 评论(0) , 阅读(1629)  |  |  
drupal多个数据库的切换。

1、定义数据库名称,用户名,前缀,编码等。
$databases = array(
   'default' =>
   array(
     'default' =>
     array(
       'driver' => 'mysql',
       'database' => 'databasename',
       'username' => 'username',
       'password' => 'password',
       'host' => 'localhost',
       'port' => 3306,
       'prefix' => 'myprefix_',
       'collation' => 'utf8_general_ci',
     ),
   ),
'legacy' =>
   array(
     'default' =>
     array(
       'driver' => 'mysql',
       'database' => 'legacydatabasename',
       'username' => 'legacyusername',
       'password' => 'legacypassword',
       'host' => 'legacy',
       'port' => 6060,
       'prefix' => 'legacyprefix_',
       'collation' => 'utf8_general_ci',
     ),
   ),

);


2、数据库的切换
//从其他数据库查询信息
db_set_active('legacy');
$result = db_query("select * from table where uid = :uid", array(':uid' => $user->uid));

//切换到默认数据库
db_set_active('default');

来自 http://www.majormoves.net/post/793/

 

 

普通分类: