在 Codeigniter 中动态加载数据库连接数据

Posted

技术标签:

【中文标题】在 Codeigniter 中动态加载数据库连接数据【英文标题】:Load database connection data dynamically in Codeigniter 【发布时间】:2017-03-04 11:18:49 【问题描述】:

我正在尝试完成以下功能:我有一个到数据库的主连接(在 application/config/database.php:db['default'] 内),并且该连接有效,它检索数据,我想要使用该数据建立与不同数据库的新连接。

这可能吗,还是我需要创建一个外部 PDO 连接来处理它?

(我使用的是 Codeigniter 3.1.0)

【问题讨论】:

【参考方案1】:

在 Touheed Khan 的帮助下,我能够找到我的问题的解决方案,将其发布在此处,因为我必须对建议的解决方案进行一些变通才能使其发挥作用。以下是我的解决方案目前的工作方式:

Controller.php

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Controller extends CI_Controller 
 public $dynamicDB;

 public function __construct() 
  parent::__construct();
 

 public function index() 
  //Somehow retrieve the following information from user.
  $host;
  $user;
  $pass;
  $dbname;
  $port;
  // End of retrieval information from user.

  $this->dynamicDB = array(
   'hostname' => $host,
   'username' => $user,
   'password' => $pass,
   'database' => $dbname,
   'dbdriver' => 'postgre',
   'dbprefix' => '',
   'pconnect' => FALSE,
   'db_debug' => TRUE,
   'port' => $port
  );

  $this->load->model('data_model');
  $result = $this->data_model->select($this->dynamicDB, 
                                      $this->get('id'));
  var_dump($result);
 

Data_model.php

<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Data_model extends CI_Model 
 function __construct()
  parent::__construct();
 

 public function returnQuery($query) 
  if ($query->num_rows() > 0) 
   return $query->result();
   else 
   return array();
  
 

 public function select($dynamicDB, $id) 
  $dynamicDB = $this->load->database($dynamicDB, TRUE);

  $dynamicDB->select('*');
  $dynamicDB->where('id', $id);
  $dynamicDB->from('table');

  $query = $dynamicDB->get();
  return $this->returnQuery($query);
 

【讨论】:

很好实现的伙伴...如果您想在当前应用程序的任何其他控制器中使用它,您可以将 dynamicDB 声明移动到帮助器,这将提供您的可重用性。谢谢! 感谢您的提示!会的!【参考方案2】:

$this-&gt;db2 = $this-&gt;load-&gt;database('seconddb', TRUE);    // 'seconddb' is a connection array key in database config like 'default'. 

更多信息请参考这个答案here,repo 已经详细解释了一切。

如果需要更多帮助,我很乐意提供帮助。

谢谢,编码愉快。

【讨论】:

好的,我明白了,但我的问题是如何将新数据传递给 database.php 文件?因为我以前使用过不同的数据库,但是 database.php 文件在我获得新连接的数据之前会自动加载,所以我无法“按时”传递数据。 @Lvkz :您可以将整个配置数组传递给 $this->load->database() 函数。有关详细信息,请参阅此答案***.com/a/25459842/4419992 嘿@Touheed Khan,您的最后一条评论为我指明了正确的方向!将添加一个包含我发现的详细信息的答案。【参考方案3】:

您可以将数组添加到/config/database.php

喜欢这篇文章 http://tutsnare.com/connecting-multiple-database-in-codeigniter/ 以及 CodeIgniter 文档中的 https://www.codeigniter.com/user_guide/database/connecting.html#connecting-to-multiple-databases

编辑

也许你需要这篇文章 codeigniter database configuration programmatically form user input

【讨论】:

正如上一个答案所揭示的,问题是在我建立第二个连接之前我没有连接数据。所以我不能事先设置第二个。如何从内部控制器设置新的数据库配置。 所以你需要保留原来的加上新的数据库。通读 Codeigniter 文档,为您提供了许多关于如何做任何您想做的事情的选项...

以上是关于在 Codeigniter 中动态加载数据库连接数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 codeigniter 实现动态菜单/页眉/页脚的最佳方法

动态数据库切换 - Codeigniter

在 php codeigniter 中包含另一个页面时,父页面未加载

从数据库加载用户特定设置和站点设置并将数据传递给视图和控制器

015.CI4框架CodeIgniter数据库操作之:带参数查询数

CodeIgniter框架连接读取MS Access数据库文件