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 之 没有mysql支持时的替代方案
Oct 09 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
Feb 16 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
php和js如何通过json互相传递数据相关问题探讨
Feb 26 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
php+js iframe实现上传头像界面无跳转
Apr 29 PHP
php更新mysql后获取改变行数的方法
Dec 25 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 PHP
实例讲解PHP中使用命名空间
Jan 27 PHP
Laravel框架创建路由的方法详解
Sep 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
php 字符串替换的方法
2012/01/10 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
php不用正则验证真假身份证
2013/11/06 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
原生JS实现留言板
2020/03/26 Javascript
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
Pandas中resample方法详解
2019/07/02 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
python 简单的调用有道翻译
2020/11/25 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
营销人才自我鉴定范文
2013/12/25 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
大学生见习总结报告
2015/06/24 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript