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的输入输出流
Feb 14 PHP
php 动态添加记录
Mar 10 PHP
php PDO中文乱码解决办法
Jul 20 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
drupal 代码实现URL重写
May 04 PHP
php写的简易聊天室代码
Jun 04 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
全面解读PHP的Yii框架中的日志功能
Mar 17 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 PHP
PHP命令Command模式用法实例分析
Aug 08 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 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生成excel列序号代码实例
2013/12/24 PHP
php导出生成word的方法
2015/12/25 PHP
PHP中的表达式简述
2016/05/29 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
JS 继承实例分析
2008/11/04 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
幼儿师范毕业生自荐信
2013/11/09 职场文书
买房子个人收入证明
2014/01/16 职场文书
市场营销调查计划书
2014/05/02 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
Go语言测试库testify使用学习
2022/07/23 Golang