9

我正在为我的drupal 7 站点编写一个包装类,它可以让我连接并查询我的phpbb 数据库。

连接到外部数据源时(根据 drupal 文档),您已设置活动数据库,运行查询,然后将活动数据库设置回默认值。

例如

db_set_active('phpbb');
$result = db_query($sql,$args,$opts);                               
db_set_active();//back to default

但是有没有办法使用drupal的数据库包装器来创建一个全新的连接,可以永久设置到新的数据库,而不必做这种来回切换的废话?当然,我们可以同时处理与多个数据库的连接。

我已经做了一些谷歌搜索,但还没有发现有人试图这样做。

4

3 回答 3

12

典型的。发布后 5 分钟我想通了......所以,对于未来的谷歌人:

基本上,您不使用 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_'
);
于 2011-01-29T20:23:33.680 回答
1

Database::addConnectionInfo()也许?

此方法允许在运行时添加新的连接凭据。在正常情况下,指定数据库凭据的首选方法是通过 settings.php。但是,此方法允许在任意时间添加它们,例如在单元测试期间、连接到管理员定义的第三方数据库时等。

如果给定的键/目标对已经存在,这个方法将被忽略。

于 2013-06-20T13:13:44.453 回答
0

getConnection 的定义引用了与上面使用的不同的参数顺序。

function getConnection($target = 'default', $key = NULL)

可悲的是,这与 Database::addConnectionInfo() 不同,后者是

public static function addConnectionInfo($key, $target, $info)

此外,在 DB_select 上,$key 不是参数,尽管它位于选项数组中:

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'总是作为设置使用,但不是替代数据库/模式的关键,需要 db_set_active('...'); 和 db_set_active(); db_select 周围。

由于在 db_select 的处理过程中很容易需要调用其他 dbs(例如 devel 调用或 alters 中的调用),因此这是一种不灵活的设计。更改此调用:

  return Database::getConnection($options['target'])->select($table, $alias, $options);

需要添加 Key 参数(它已经被指定为参数!!),但就我现在所见而言还不够。

于 2014-06-08T16:51:57.927 回答