2016-12-16 5 views
0

私はcodeigniterプロジェクトであなたの助けが必要です。私は設定フォルダのdatabseファイルのデータベースを動的に変更するためにセッションを使用したい。 私は$ db ['default'] ['database'] = $ _SESSION ['db_name']を設定ファイルに入れていますが、動作しません。 ログインページログインを行う他のデータベースアクセスを確認する必要があります。Codeigniterデータベースクラスのセッションを使用

データベースを選択する前に接続を変更することはできますか?

ログインページ

public function login(){ 
if(!$this->session->userdata('id_funcionario') || !$this->session->userdata('logado')){ 

    $this->db->database= "test"; 
    $this->session->destroy(); 
    $subdomain = $_SERVER['HTTP_HOST']; 
    $this->db->select("database"); 
    $this->db->where("subdomain", $subdomain); 
    $access = $this->db->get("table")->row(); 
    $this->session->set_userdata("database", $access->database); 
    $this->load->view('/geral/login'); 

}else{ 
    $url = base_url('home'); 
    header("Location: $url "); 

} 

}

ログインページの作品!

データはAJAXのために送信されます。

<?php if(!defined('BASEPATH')) exit('No direct script access allowed'); 
class Ajax extends CI_Controller { 

    public function __construct(){ 
     parent::__construct(); 
     $this->load->helper('url'); 
     $this->load->helper('html'); 
     $this->load->library('session'); 

    } 
public function toLog() 
    { 
     $email = $this->input->post('email'); 
     $pass= md5($this->input->post('pass')); 

     $this->db->database = $this->session->userdata('database'); 
     $this->db->select('*'); 
     $this->db->from('users'); 
     $this->db->where('usu_email',$email); 
     $this->db->where('usu_pass',$pass); 
     $usuario = $this->db->get()->result(); 

しかし、私は、クエリの時間にデータベースの名前を変更する方法がわかりません。私は試しましたが、それは変わりません。

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 


/** 
* Database Driver Class 
* 
* This is the platform-independent base DB implementation class. 
* This class will not be called directly. Rather, the adapter 
* class for the specific database will extend and instantiate it. 
* 
*/ 

    class CI_DB_driver { 

    var $username; 
    var $password; 
    var $hostname; 
    var $database; 

....... 

    /** 
    * Constructor. Accepts one parameter containing the database 
    * connection settings. 
    * 
    * @param array 
    */ 
    function __construct($params) 
    { 
     if (is_array($params)) 
     { 
      foreach ($params as $key => $val) 
      { 
       $this->$key = $val; 
      } 
     } 
     $CI = & get_instance(); 
     $this->database = $CI->session->userdata('database'); 

     log_message('debug', 'Database Driver Class Initialized'); 
    }.... 

お手伝いできますか?

答えて

0

これはあなたの質問に答えるが、それが役立つかどうかはわかりません。

https://www.codeigniter.com/user_guide/database/connecting.html#connecting-to-multiple-databases

あなたはただしかし、あなたはセッションデータ変数を設定しようとすると、セッションを破壊し、あなたのコードでは

$this->db->db_select($database2_name); 

を使用して、任意の時点でデータベースを切り替えることができます。セッションが破棄されたため、新しいセッションが作成されるまで、変数はどこにも設定されません。

あなたのデータベースを設定ファイルとスイッチグループのグループとして設定することをお勧めします。あるいは、ドキュメントに記載されているように一度に両方に接続し、データベースオブジェクトを使用してクエリを設定することによって使用するものを選択することもできます。実際には、セッション変数のデータベースを設定することは、IMHOの問題に近づくには奇妙な方法に思えるので、おそらくあなたのロジックを再訪する必要があると私は本当に思っています。

しかし、あなたのコントローラでは、あなたのセッション変数を読み、それがあなたのシステムの認識されたデータベースであることを確認し、ユーザがそれにアクセスすることを許可されていることを確認してください。設定ファイルの読み込み時にセッションデータが利用できない可能性があるので、設定ファイルのセッションデータにアクセスしようとしないでください。

関連する問題