Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 切换codigniter中的数据库服务器进行读写操作。_Php_Mysql_Codeigniter 3 - Fatal编程技术网

Php 切换codigniter中的数据库服务器进行读写操作。

Php 切换codigniter中的数据库服务器进行读写操作。,php,mysql,codeigniter-3,Php,Mysql,Codeigniter 3,我已经为我的数据库服务器完成了主服务器和从服务器的设置,所以在我的codigniter应用程序中,我想要的是在主服务器上执行所有写选项,在从服务器上执行所有读操作 有人能告诉我如何在codigniter版本3中实现这一点吗 谢谢。您应该在'application/config/database.php'中提供第二个数据库信息 通常,您会设置默认数据库组,如下所示: $db['default']['hostname'] = "localhost"; $db['default']['username

我已经为我的数据库服务器完成了主服务器和从服务器的设置,所以在我的codigniter应用程序中,我想要的是在主服务器上执行所有写选项,在从服务器上执行所有读操作

有人能告诉我如何在codigniter版本3中实现这一点吗


谢谢。

您应该在'application/config/database.php'中提供第二个数据库信息

通常,您会设置默认数据库组,如下所示:

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$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;
请注意,登录信息和设置在名为
$db['default']
的数组中提供

然后,您可以在一个新数组中添加另一个数据库——我们称之为“otherdb”

$db['otherdb']['hostname'] = "localhost";
$db['otherdb']['username'] = "root";
$db['otherdb']['password'] = "";
$db['otherdb']['database'] = "other_database_name";
$db['otherdb']['dbdriver'] = "mysql";
$db['otherdb']['dbprefix'] = "";
$db['otherdb']['pconnect'] = TRUE;
$db['otherdb']['db_debug'] = FALSE;
$db['otherdb']['cache_on'] = FALSE;
$db['otherdb']['cachedir'] = "";
$db['otherdb']['char_set'] = "utf8";
$db['otherdb']['dbcollat'] = "utf8_general_ci";
$db['otherdb']['swap_pre'] = "";
$db['otherdb']['autoinit'] = TRUE;
$db['otherdb']['stricton'] = FALSE;
如果需要同时连接到多个数据库,可以按如下方式进行:

$readDB = $this->load->database('otherdb', TRUE);

//For read:
$query = $readDB->select('first_name, last_name')->get('person');
var_dump($query);

//For write:
$this->db->insert('tablename', $insert_array);

您必须更新system/database/DB_Driver.php文件

它非常简单,你必须在这个文件中做3个小改动

1) 在构造内部添加读写服务器凭据

        $this->server_details['local_server']['hostname'] = "localhost";
        $this->server_details['local_server']['username'] = "select_user";
        $this->server_details['local_server']['password'] = "password";       

        $this->server_details['live_server']['hostname'] = "192.192.223.22";  
        $this->server_details['live_server']['username'] = "write_user"; 
        $this->server_details['live_server']['password'] = "password";        
2) 创建新函数将切换数据库连接以进行选择和写入查询

 private function ebrandz_switch_db_for_read_write($sql) {               

       if( $this->hostname == $this->server_details['local_server']['hostname'] &&  $this->username == $this->server_details['local_server']['username'] &&  $this->password == $this->server_details['local_server']['password'] ) {    
                   //echo $sql.'<br/>';
         if(stristr($sql, 'SELECT')) {   
                            foreach($this->server_details['local_server'] as $index_key => $index_value ) { 
                                $this->$index_key = $index_value;  
                            }             

                              $this->conn_id = null;  //unset resource link 
                              $this->initialize();   //Reinitialize connnection with new parameters                                                                                                       

                    } else {    
                            //die('write operation is not allowed.');
                            foreach($this->server_details['live_server'] as $index_key => $index_value ) { 
                                 $this->$index_key = $index_value;  
                            }  
                            $this->conn_id = null ; //unset resource link 
                            $this->initialize();    //Reinitialize connnection with new parameters                                                           
                    }

               } else if( $this->hostname == $this->server_details['live_server']['hostname'] &&  $this->username == $this->server_details['live_server']['username']  &&  $this->password ==  $this->server_details['live_server']['password'] ) {  

                    if(stristr($sql, 'SELECT')) { 
                            foreach($this->server_details['local_server'] as $index_key => $index_value ) { 
                                 $this->$index_key = $index_value;  
                            }  

                            $this->conn_id = null ;  //unset resource link 
                            $this->initialize();     //Reinitialize connnection with new parameters      

                    } else {  
                            //die('write operation is not allowed.');
                            foreach($this->server_details['live_server'] as $index_key => $index_value ) { 
                                 $this->$index_key = $index_value;
                            } 

                            $this->conn_id = null ; //unset resource link 
                            $this->initialize();    //Reinitialize connnection with new parameters                                                           
                    }

               }

               //Code to re initialize the connection 
    }

您可以有两个数据库连接,每当有写操作时使用主对象,每当有读操作时使用salve objAre您在找这个吗??实际上,我的应用程序已经完成,我不想创建两个单独的连接,也不想编辑所有的应用程序模型文件。因此,我正在寻找codigniter hack,它可以动态切换数据库以进行读写操作。您可以尝试使用系统数据库文件夹中的系统文件。我已经发布了答案,并且它正在按照要求工作。我知道这一直截了当的方法,我的要求是保持数据库连接处于活动状态,并根据选择切换服务器或者更新查询您希望根据选择或更新查询更改交换机服务器,而不是扩展数据库libraray。是的,实际上我的应用程序已经在运行,并且有很多模型文件,因此我不想更新我检查的每个文件,我认为这是不可能的。但您必须更改系统文件。如果您解决了问题,请告诉我。是的,我知道我必须更改系统文件?
// Verify table prefix and replace if necessary
    if ($this->dbprefix !== '' && $this->swap_pre !== '' && $this->dbprefix !== $this->swap_pre)
    {
        $sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql);
    }

     /**
     * @author Anant Waykar
     * if query is read only then load some other database
     */
            $this->ebrandz_switch_db_for_read_write($sql);                     
      //Code to re initialize the connection