【问题标题】:CodeIgniter & DBForge - Create Database and TablesCodeIgniter & DBForge - 创建数据库和表
【发布时间】:2013-05-06 05:29:06
【问题描述】:

我正在尝试在 CodeIgniter 中编写一个脚本,该脚本将创建一个数据库,然后将表与新表中的各种字段一起添加到新创建的数据库中。

到目前为止,我已经使用 dbforge 创建新数据库,但由于我使用的是数据库库并具有预设的数据库连接值,因此在创建表时,它会将其放入预先选择的数据库中而不是它刚刚创建的那个。

在 database.php 配置文件中,我有以下内容:

$db['default']['database'] = 'db1';

如果我使用以下命令创建一个新数据库:

$this->dbforge->create_database('db2');

'db2' 将被创建,但随后以下命令将表放入 'db1'。

$this->dbforge->create_table('table1');

我需要在“db2”中创建的“table1”。如何让 CI 选择新创建的数据库('db2')在正确的位置创建表,然后切换回 'db1'?

我已经查看了与我正在做的类似的以下问题,但我不想在 database.php 中放置任何进一步的连接条目

Codeigniter showing error: No database selected

任何帮助表示赞赏!

编辑 - 我应该补充一点,create_database 可以有任何名称作为数据库名称...这是一个脚本,用于自动创建数据库和从数据库名称中提取的相关表表格。

【问题讨论】:

  • 如何放置 $this->dbforge->create_database('db2');。我不知道这样做。我可以知道吗?我已将它放在 index 函数的 controllers/migrate.php 中,但我总是出错。谢谢。

标签: php codeigniter


【解决方案1】:

由于您在配置中的默认数据库是 db1 create_table 方法将始终在选定的数据库中创建表,创建 db2 后您需要选择 db2 在该数据库中创建表,您可以按照以下方式进行操作

    $config['hostname'] = "localhost";
    $config['username'] = "myusername";
    $config['password'] = "mypassword";
    $config['database'] = "db2";
    $config['dbdriver'] = "mysql";
    $config['dbprefix'] = "";
    $config['pconnect'] = FALSE;
    $config['db_debug'] = TRUE;
    $config['cache_on'] = FALSE;
    $config['cachedir'] = "";
    $config['char_set'] = "utf8";
    $config['dbcollat'] = "utf8_general_ci";

   $db2 = $this->load->database($config,TRUE);
   $db2->dbforge->create_table('table1');

   //if  you want to close connection
   $db2->db->close();

更多信息请查看 CI 用户指南CI user Guide Connecting Database

【讨论】:

  • 我已经这样做了,但我得到了错误...未定义的属性:CI_DB_mysql_driver::$dbforge
【解决方案2】:

change database connection of codeigniter migration

我已使用上述问题中提供的建议来解决我的问题。创建第二个数据库后,我使用以下命令切换到它:

$this->db->query('use db2');

这让我可以在 db2 中创建表。然后使用以下命令切换回默认数据库:

$this->db->query('use DB1');

完全按照我想要的方式工作。

【讨论】:

    【解决方案3】:
    $this->db->query('use db2');
    
    $this->db->query('use DB1');
    

    【讨论】:

      【解决方案4】:
          if ($this->dbforge->create_database('my_db_test'))
      {
          try{
            $current_database = "my_db_test";
            $this->db->database = $current_database;
           $this->db->close();
           $config['hostname'] = "localhost";
           $config['username'] = "root";
           $config['password'] = "";
           $config['database'] = $current_database;
           $config['dbdriver'] = "mysql";
           $config['dbprefix'] = "";
           $config['pconnect'] = FALSE;
           $config['db_debug'] = TRUE;
           $config['cache_on'] = FALSE;
           $config['cachedir'] = "";
           $config['char_set'] = "utf8";
           $config['dbcollat'] = "utf8_general_ci";
           $this->load->database($config);
          $fields = array(
                              'blog_id' => array(
                                                       'type' => 'INT',
                                                       'constraint' => 5,
                                                       'unsigned' => TRUE,
                                                       'auto_increment' => TRUE
                                                ),
                              'blog_title' => array(
                                                       'type' => 'VARCHAR',
                                                       'constraint' => '100',
                                                ),
                              'blog_author' => array(
                                                       'type' =>'VARCHAR',
                                                       'constraint' => '100',
                                                       'default' => 'King of Town',
                                                ),
                              'blog_description' => array(
                                                       'type' => 'TEXT',
                                                       'null' => TRUE,
                                                ),
                      );
      
          $this->dbforge->add_field($fields);
          $this->dbforge->add_key('blog_id', TRUE);
          $this->dbforge->create_table('ipn_log', TRUE);
          }catch(Exception $e){
          echo $e->getMessage();die;
         }
        }
      
      }
      

      【讨论】:

        【解决方案5】:

        更好的方法是获取代表您要操作的数据库的 dbforge 类

        $this->myforge = $this->load->dbforge($this->other_db, TRUE);
        

        使用$this->myforge 对象照常工作。

        此方法将避免在构建库时发生冲突。最好不要在运行时弄乱图书馆用户的默认数据库。

        【讨论】:

        • 这是CI3及以上的不错选择。附言CI4 语法:$this->myforge = \Config\Database::forge('other_db');
        【解决方案6】:

        当您想在项目中使用 2 个数据库时,首先您需要将两个数据库定义为 -

        $DB1 = $this->load->database('group_one', TRUE);

        $DB2 = $this->load->database('group_two', TRUE);

        当您以这种方式连接时,您将使用您的对象名称而不是本指南中使用的语法来发出命令。换句话说,而不是发出命令:

        $this->db->query();

        $this->db->result();

        等等……

        您将改为使用:

        $DB1->查询();

        $DB1->结果();

        等等……

        【讨论】:

        • 这个答案在技术上是正确的,但没有回答问题。这对 dbforge 使用的数据库没有影响。这不会更改 dbforge 使用的默认数据库的数据库。
        猜你喜欢
        • 1970-01-01
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多