Drupal7连接多个数据库及常见问题解决

 更新时间:2014年03月02日 15:43:04   作者:  
这篇文章主要介绍了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');,设置数据库连接恢复到默认。

相关文章

  • php版微信公众平台入门教程之开发者认证的方法

    php版微信公众平台入门教程之开发者认证的方法

    这篇文章主要介绍了php版微信公众平台入门教程之开发者认证的方法,结合实例形式分析了php版微信公众平台开发者认证的步骤与相关操作技巧,需要的朋友可以参考下
    2016-09-09
  • PHP开发框架kohana中处理ajax请求的例子

    PHP开发框架kohana中处理ajax请求的例子

    这篇文章主要介绍了PHP开发框架kohana中处理ajax请求的例子,kohana是一个PHP5开发框架,需要的朋友可以参考下
    2014-07-07
  • Thinkphp 中 distinct 的用法解析

    Thinkphp 中 distinct 的用法解析

    TP中distinct()的用处主要是去除重复的值,下面我通过实例代码给大家介绍下Thinkphp 中 distinct 的用法,一起看看吧
    2016-12-12
  • twig里使用js变量的方法

    twig里使用js变量的方法

    这篇文章主要介绍了twig里使用js变量的方法,结合实例形式对比分析了在twig中使用js变量的相关调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-02-02
  • laravel框架创建授权策略实例分析

    laravel框架创建授权策略实例分析

    这篇文章主要介绍了laravel框架创建授权策略,结合实例形式分析了laravel框架创建授权策略的相关步骤、实现方法与操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Laravel5.1 框架数据库操作DB运行原生SQL的方法分析

    Laravel5.1 框架数据库操作DB运行原生SQL的方法分析

    这篇文章主要介绍了Laravel5.1 框架数据库操作DB运行原生SQL的方法,结合实例形式分析了laravel5.1使用DB运行原生SQL的相关操作技巧与注意事项,需要的朋友可以参考下
    2020-01-01
  • CodeIgniter配置之config.php用法实例分析

    CodeIgniter配置之config.php用法实例分析

    这篇文章主要介绍了CodeIgniter配置之config.php用法,结合实例形式详细的分析了CodeIgniter中配置文件config.php的参数含义及具体使用技巧,需要的朋友可以参考下
    2016-01-01
  • 将php数组输出html表格的方法

    将php数组输出html表格的方法

    这篇文章主要介绍了将php数组输出html表格的方法,需要的朋友可以参考下
    2014-02-02
  • thinkphp诸多限制条件下如何getshell详解

    thinkphp诸多限制条件下如何getshell详解

    这篇文章主要给大家介绍了关于thinkphp诸多限制条件下如何getshell的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • php微信开发之百度天气预报

    php微信开发之百度天气预报

    这篇文章主要为大家详细介绍了php微信开发之百度天气预报的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11

最新评论