我正在为drupal 7网站编写一个包装类,它允许我连接并查询我的phpbb数据库。
连接到外部数据源时(根据drupal文档),您已设置活动数据库,运行查询,然后将活动数据库恢复为默认值。
e.g。
db_set_active('phpbb');
$result = db_query($sql,$args,$opts);
db_set_active();//back to default
但有没有办法使用drupal的数据库包装器来创建一个全新的连接,可以永久设置到新的数据库,而无需这样做来回切换废话?当然,我们可以同时处理与多个数据库的连接。
我做了一些谷歌搜索,但还没有找到任何人试图这样做。
答案 0 :(得分:12)
典型。发布后5分钟我想出来......所以,对于未来的googlers:
基本上,您不使用db_query,而是在连接上运行查询而不设置活动链接。
你可以通过查看db_query如何工作来解决这个问题: http://api.drupal.org/api/drupal/includes--database--database.inc/function/db_query/7
所以它看起来像这样:
$target='default';
$key = 'phpbb';
$phpbb = Database::getConnection($target,$key);
$result = $phpbb->query($sql,$args,$opts);
这假设您在settings.php中配置了一个数据库,如下所示:
$databases['phpbb']['default'] = array(
'driver' => 'mysql',
'database' => 'forum',
'username' => 'username',
'password' => 'password',
'host' => 'mysql.host.com',
'prefix' => 'phpbb3_'
);
答案 1 :(得分:1)
Database::addConnectionInfo()?
此方法允许添加新的连接凭据 运行。一般情况下指定的首选方式 数据库凭据是通过settings.php。但是,这种方法允许 它们是在任意时间添加的,例如在单元测试期间,何时 连接到管理员定义的第三方数据库等
如果给定的键/目标对已存在,则此方法将为 忽略。
答案 2 :(得分:0)
getConnection的定义引用了与上面使用的参数不同的顺序。
function getConnection($target = 'default', $key = NULL)
这与数据库:: addConnectionInfo()
有很大的不同public static function addConnectionInfo($key, $target, $info)
另外,在DB_select上,$ key不是参数,尽管它位于options数组中:
function db_select($table, $alias = NULL, array $options = array()) {
if (empty($options['target'])) {
$options['target'] = 'default';
}
return Database::getConnection($options['target'])->select($table, $alias, $options);
}
而
final public static function getConnection($target = 'default', $key = NULL) {
所以这意味着'master'或'slave'或'default'总是被用作set,但不是替代数据库/模式的关键,需要db_set_active('...');和db_set_active();在db_select周围。
由于在db_select的处理过程中很容易需要调用其他dbs(例如devel调用或调用中的调用),这是不灵活的设计。改变这个电话:
return Database::getConnection($options['target'])->select($table, $alias, $options);
添加Key参数(它已经被指定为参数!!)是需要的,但是到目前为止我看不到。