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简单静态页生成过程
Mar 27 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
php的zip解压缩类pclzip使用示例
Mar 14 PHP
Yii2中cookie用法示例分析
Jul 18 PHP
PHP反射API示例分享
Oct 08 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
Oct 19 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
Jun 19 PHP
laravel 实现登陆后返回登陆前的页面方法
Oct 03 PHP
详解PHP Swoole与TCP三次握手
May 27 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
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
jquery 3D 标签云示例代码
2014/06/12 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
原生Vue 实现右键菜单组件功能
2019/12/16 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
python处理json数据中的中文
2014/03/06 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
Python的UTC时间转换讲解
2019/02/26 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
python进程和线程用法知识点总结
2019/05/28 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
python的re模块使用方法详解
2019/07/26 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
python中四舍五入的正确打开方式
2021/01/18 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
《逃家小兔》教学反思
2014/02/23 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
维稳承诺书
2015/01/20 职场文书
爱晚亭导游词
2015/02/09 职场文书
超市督导岗位职责
2015/04/10 职场文书
教师节主题班会教案
2015/08/17 职场文书