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 Undefined index和Undefined variable的解决方法
Mar 27 PHP
PHP foreach循环使用详解与实例代码
May 08 PHP
关于php内存不够用的快速解决方法
Oct 26 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
php小技巧之过滤ascii控制字符
May 14 PHP
使用Appcan客户端自动更新PHP版本号(全)
Jul 31 PHP
PHP-FPM实现性能优化
Mar 31 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
Feb 04 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
May 17 PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
Yii框架页面渲染操作实例详解
Jul 19 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
PHP用反撇号执行外部命令
2015/04/14 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
2017/08/02 PHP
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
JS实现的自定义水平滚动字体插件完整实例
2016/06/17 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
python实现目录树生成示例
2014/03/28 Python
详解Python的单元测试
2015/04/28 Python
python在指定目录下查找gif文件的方法
2015/05/04 Python
python range()函数取反序遍历sequence的方法
2018/06/25 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
python实现图片筛选程序
2018/10/24 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
UNIX文件系统常用命令
2012/05/25 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
骨干教师培训感言
2014/01/16 职场文书
高中军训感想300字
2014/03/04 职场文书
市政管理求职信范文
2014/05/07 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
责任书格式
2019/04/18 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript