CodeIgniter动态数据库无法正常工作

时间:2015-05-28 15:50:56

标签: php database codeigniter

我见过this topic并试图以这种方式实施,但不幸的是没有用。

我需要使用CodeIgniter动态连接到数据库。此数据库不能是文件application/config/databases.php中的常量变量。我尝试了两种不同的方法连接到不同的数据库:

第一个是模型 - 第三个参数为documentation refers

class users extends CI_Controller
{
   public function __construct()
   {
      parent::_construct();

      $config['hostname'] = 'localhost';
      $config['username'] = 'root';
      $config['password'] = '';
      $config['database'] = 'clockin_AlKj';
      $config['dbdriver'] = 'mysqli';
      $config['dbprefix'] = '';
      $config['pconnect'] = FALSE;
      $config['db_debug'] = TRUE;

      $this->load->model('company_model', '', $config);
      $this->company = $this->company_model->get();
   }
}

这会引发错误:

  

错误号码:1146

     

表'clockin_admin.company'不存在

     

SELECT * FROM(company

     

文件名:C:\ xampp \ htdocs \ clockin \ system \ database \ DB_driver.php

第二种方法是使用数据库进行连接。

 class users extends CI_Controller
 {
    public function __construct()
    {
       parent::_construct();

       $this->load->model('company_model');
       $this->company = $this->company_model->get();
    }
 }

class Company_model extends CI_model
{
   private $otherDb;

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

      $config['hostname'] = 'localhost';
      $config['username'] = 'root';
      $config['password'] = '';
      $config['database'] = 'clockin_AlKj';
      $config['dbdriver'] = 'mysqli';
      $config['dbprefix'] = '';
      $config['pconnect'] = FALSE;
      $config['db_debug'] = TRUE;

      $this->otherDb = $this->load->database($config);
   }

   public function get()
   {
      $this->otherDb->get('company')->row();
   }
}

这会引发错误:

  

致命错误:在非对象中调用成员函数get()   在线C:\ xampp \ htdocs \ clockin \ application \ models \ company_model.php   45

其中涉及第$this->otherDb->get('company')->row();

问题是如果我验证连接是否已建立,它也会返回错误。

if($this->load->database($config) === FALSE)
   echo 'Yes, I could not connect..';

最后,我对文件database.php的配置如下:

$active_group = 'default';
$active_record = TRUE;

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'clockin_admin';
$db['default']['dbdriver'] = 'mysqli';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

3 个答案:

答案 0 :(得分:1)

您可以在加载数据库后更改配置:

class Company_model extends CI_model
{
  private $otherDb;

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

    $this->load->database();

    $this->db->hostname = 'localhsot';
    $this->db->username = 'root';
    $this->db->password = '';
    $this->db->database = 'clockin_AlKj';
    $this->db->dbprefix = '';
    $this->db->pconnect = FALSE;
    $this->db->db_debug = TRUE;
  }

  public function get()
  {
     $this->db->get('company')->row();
  }
}

你无法以这种方式改变司机。

答案 1 :(得分:1)

抱歉,我一开始给了你错误的答案。我只是忽略了CodeIgniter代码而且它可能很难实现。这是另一种解决方案:

您可以使用“连接字符串”作为第一个参数来动态创建数据库,并使用TRUE作为第二个参数,因此它不会替换$this->db var,而只是将数据库对象返回到{{1} }:

$this->otherDb

它应该像预期的那样工作

如果要设置dbprefix,pconnect或db_debug,可以通过定义“连接字符串”的查询部分来实现:

$this->otherDb = $this->load->database('mysql://username:password@hostname:9090/database',TRUE);  

来源:https://ellislab.com/codeigniter/user-guide/database/connecting.html

答案 2 :(得分:1)

请尝试将其用于mysqli的持续版本

$this->otherDb = $this->load->database('mysqli://username:password@hostname:3306/database',TRUE);