当前位置:  编程技术>php

drupal7连接多个数据库问题解析

    来源: 互联网  发布时间:2014-10-04

    本文导语:  本节内容: drupal7连接多个数据库的问题与解决方法 如果你在使用drupal7时,遇到这些问题: 1,drupal如何连接到多个数据库? 2,drupal连接到多个数据库后,但是发现程序报错,这是怎么了? 3,drupal获取、添加、修改、删除...

本节内容:
drupal7连接多个数据库的问题与解决方法

如果你在使用drupal7时,遇到这些问题:
1,drupal如何连接到多个数据库?
2,drupal连接到多个数据库后,但是发现程序报错,这是怎么了?
3,drupal获取、添加、修改、删除多个数据库时,数据没有正确的写入数据库或者读取到空的数据,怎么解决?
4,只想在drupal某个函数调用或控制其他数据库,但是失败了?

可以参考本文给出的解决方法。

一、drupal如何连接到多个数据库?
允许drupal连接多个数据库,需要转换$db_url为数组。
默认连接单个数据库的url格式(字符串):
 

代码示例:

 

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


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Drupal7 form表单二次开发要点与实例
  • Drupal7中常用的数据库操作实例
  • drupal7常用数据库操作实例


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3