簡體   English   中英

Codeigniter使用數據庫類中的會話

[英]Codeigniter using sessions in Database class

我在codeigniter項目中需要您的幫助。 我想使用會話來動態更改config文件夾中的databse文件。 我在配置文件中執行$ db ['default'] ['database'] = $ _SESSION ['db_name'],但不起作用。 登錄頁面應檢查其他哪些數據庫訪問權限可以登錄。

選擇數據庫之前可以更改連接嗎?

登錄頁面

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');
    }....

你可以幫幫我嗎?

我不確定這是否可以回答您的問題,但可能會有所幫助。

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

您可以隨時使用來切換數據庫

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

但是在代碼中,您破壞了會話,然后嘗試設置會話數據變量。 會話已被破壞,因此在創建新會話之前不會在任何地方設置變量。

我建議您將數據庫設置為配置文件中的組並切換組。 或者,您可以按照文檔中的說明一次連接到這兩者,並通過使用數據庫對象設置查詢對象來選擇使用哪一個。 雖然老實說,我確實認為也許您需要重新審視邏輯,因為在會話變量中設置數據庫似乎是解決IMHO任何問題的一種很奇怪的方法。

但是,如果您在控制器中讀取了會話變量,請檢查它是否為系統公認的數據庫,請檢查是否允許用戶訪問它,然后連接到它,應該可以正常工作。 您不應該嘗試訪問配置文件中的會話數據,因為在讀取配置文件時,會話數據可能將不可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM