【问题标题】:CodeIgniter dynamic database not workingCodeIgniter 动态数据库不工作
【发布时间】:2015-05-28 15:50:56
【问题描述】:

我见过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”不存在

选择 * 来自 (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;

【问题讨论】:

    标签: php database codeigniter


    【解决方案1】:

    对不起,我一开始给了你错误的答案。我只是忽略了 CodeIgniter 代码,它可能会起作用。这是另一种解决方案:

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

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

    它应该按预期工作

    另外如果你想设置dbprefix、pconnect或者db_debug,你可以通过定义'connection string'的查询部分来实现:

    $this->otherDb = $this->load->database('mysql://username:password@hostname:9090/database?dbprefix=pre_&pconnect=FALSE&db_debug=TRUE',TRUE);
    

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

    【讨论】:

    • 它仍然无法正常工作。它继续关注database.php 文件中的数据库集。 $this->otherDb = $this->load->database('mysql://root:@localhost:9090/clockin_AlKj',TRUE);
    • 你确定吗?我刚刚测试过,这种方法有效。也许您的密码字符串包含一些可能会混淆解析器的符号?另外,您的服务器真的在端口 9090 上运行吗?如果是默认端口,则无需指定。
    • 你是否将get方法恢复为$this->otherDb->get('company')->row(); ?
    • 是的,我做到了,而且我没有密码(我现在在本地主机上工作)。 XAMPP中MySQL的端口是3306,我也试过那个端口。我没有使用不同的子域,但我遇到了这个解决方案stackoverflow.com/questions/20785134/…,我会尝试一下。
    • 我的项目将允许多个数据库但在同一个域中。
    【解决方案2】:

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

    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();
      }
    }
    

    你不能那样改变驱动程序。

    【讨论】:

    • 我刚刚进行了更改,它继续指向clockin_admin 数据库而不是clockin_AlKj。给出的错误与我发布的第一个错误相同。
    • 将 $this->load->database() 行移到其他语句下方应该可以解决。
    【解决方案3】:

    请试试这个它适用于 mysqli 的最新版本

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

    【讨论】:

      猜你喜欢
      • 2012-06-18
      • 2015-06-04
      • 2019-04-02
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多