【问题标题】:CodeIgnite change default database name on the flyCodeIgniter 即时更改默认数据库名称
【发布时间】:2015-03-16 16:22:16
【问题描述】:

我有 codeigniter 设置来连接到 2 个数据库(默认和站点)。我需要动态更改默认数据库名称,任何使用默认连接的东西也应该使用新数据库。有没有办法做到这一点?

这样做的原因是我想设置一个在某些数据库上运行命令的 cron 脚本。我需要能够动态更改它,并且无法编辑 application/config/database.php。

$active_group = 'default';
$active_record = TRUE;
$phppos_client_name = substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], '.'));

$db['site']['hostname'] = 'php-pos-db';
$db['site']['username'] = 'phppoint';
$db['site']['password'] = 'password';
$db['site']['database'] = 'phppoint_site';
$db['site']['dbdriver'] = 'mysql';
$db['site']['dbprefix'] = '';
$db['site']['pconnect'] = FALSE;
$db['site']['db_debug'] = FALSE;
$db['site']['cache_on'] = FALSE;
$db['site']['cachedir'] = '';
$db['site']['char_set'] = 'utf8';
$db['site']['dbcollat'] = 'utf8_general_ci';
$db['site']['swap_pre'] = '';
$db['site']['autoinit'] = TRUE;
$db['site']['stricton'] = FALSE;

$db['default']['hostname'] = "php-pos-db";
$db['default']['username'] = "phppoint";
$db['default']['password'] = "password";
$db['default']['database'] = "phppoint_$phppos_client_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "phppos_";
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_unicode_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;


/* End of file database.php */
/* Location: ./application/config/database.php */

【问题讨论】:

  • $this->load->database('site')
  • 将 `$this->load->database('DB_NAME') 允许程序中的所有数据库查询使用该数据库进行其余的执行吗?真的这么简单吗?
  • DB_NAME 并不表示数据库名称。它是数据库配置中的变量名称。这里是 defaultsite
  • 所以如果我将配置添加到文件中;它会工作吗?如果我有 100 个,这会导致任何性能问题吗?
  • 如果你希望所有运行时查询都使用这个数据库,那么你可以在MY_controller的构造函数中加载它。如果您希望系统使用它,那么您需要创建一个hook

标签: php mysql codeigniter


【解决方案1】:

你想要的方式我认为它是不可能的。你可以用另一种方式来做。

1.不要在自动加载配置中加载数据库。
2.在执行查询之前使用$this->load->database('site')$this->load->database('default')手动加载数据库。

【讨论】:

    【解决方案2】:

    3 种方法(虽然可能有很多)

    1. 读取整个文件,将其保存为 fileName.txt(具有更新的数据库名称)并将文件重命名为 database.php

    2. 您将在哪里存储数据库名称(如果它在文件中,则从文件中读取值并将其放在 php 中)?您将不得不通过在此文件中添加代码来使其混乱

    3. 如果您将数据库名称保存到另一个数据库中(该代码将是静态的),请获取名称并保存到 $var 变量中并在配置中分配它。

    【讨论】:

    • 1.这不是一个选项,因为我只想影响从 CLI 运行的脚本。程序的其他动作需要按原样使用database.php文件。 2.我目前使用database.php从url中拉取子域来加载正确的数据库。 3.我不明白这个
    【解决方案3】:

    整个 Code Igniter 应用程序的 db 规范取决于配置规范,并且不能动态更改。它存在于系统内部,除非您使用文本编辑器对其进行修改,否则不允许对其进行修改。

    我会通过放置以下内容来动态覆盖应用程序代码中的数据库名称:

    $this->load->database('db1')
    

    第二个动态捕获包括:

    $this->load->database('db2')
    

    【讨论】:

    • 但是我可以将数据库添加到配置中,它会正常工作吗?
    • 它会起作用,您可以指定多个数据库,但默认情况下只会使用一个。如果动态代码将在您的应用代码中,您可以动态加载数据库。
    【解决方案4】:
    class CronModel extends CI_Model 
    {
        public function run()
        {
            // The default database configuration $db['default']
            $query1 = $this->db->query();
    
            // pass true as second param to use active record
            // ie : $site->select()->get();
            $site = $this->load->database('site', true);
    
            // The site database configuration $db['site']
            $query2 = $site->query();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多