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


Posted in PHP onMarch 02, 2014

如果你遇到这些问题:
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面试题附答案
Jan 07 PHP
浅析PHP递归函数返回值使用方法
Feb 18 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
php 类自动载入的方法
Jun 03 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
Apr 23 PHP
PHP学习笔记之php文件操作
Jun 03 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
Zend Framework动作控制器用法示例
Dec 09 PHP
PHP命名空间定义与用法实例分析
Aug 14 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
Aug 03 PHP
php 文件上传至OSS及删除远程阿里云OSS文件
Jul 04 PHP
Drupal读取Excel并导入数据库实例
Mar 02 #PHP
Drupal7 form表单二次开发要点与实例
Mar 02 #PHP
Drupal7中常用的数据库操作实例
Mar 02 #PHP
php设计模式之命令模式使用示例
Mar 02 #PHP
php接口和抽象类使用示例详解
Mar 02 #PHP
php通过字符串调用函数示例
Mar 02 #PHP
php多维数组去掉重复值示例分享
Mar 02 #PHP
You might like
PHP.MVC的模板标签系统(三)
2006/09/05 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
php求正负数数组中连续元素最大值示例
2014/04/11 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
php里array_work用法实例分析
2015/07/13 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
js微信分享API
2020/10/11 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
学习vue.js计算属性
2016/12/03 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
天猫精选:上天猫,就够了
2016/09/21 全球购物
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
雅虎笔试题(字符串操作)
2015/03/24 面试题
应届生学校辅导员求职信
2013/11/07 职场文书
关于做家务的心得体会
2016/01/23 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
python 中的jieba分词库
2021/11/23 Python