Codeigniter使用Database类中的会话

时间:2016-12-16 18:46:05

标签: php ajax codeigniter session

我需要你在codeigniter项目中的帮助。我想在config文件夹中使用会话来动态更改数据库中的数据库文件。 我在配置文件中执行$ 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');
    }....
你可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

我不确定这是否会回答你的问题,但这可能会有所帮助。

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

您只需使用

即可随时切换数据库
void sortlist(node** head) {
    if (*head == NULL) {
        printf("Empty list \n");
    }
    node *index1 = (*head)->next;
    node *prev = *head;

    while (index1 != NULL) {
        if (index1->data % 2 == 0) {
            prev->next = index1->next;
            index1->next = *head;
            *head = index1;
        }
        else {
            prev = index1;
        }
        index1 = prev->next;
    }
}

在您的代码中,您会销毁会话,然后尝试设置会话数据变量。会话已被破坏,因此在创建新会话之前,不会在任何地方设置变量。

我建议您在配置文件和交换机组中将数据库设置为组。或者,您可以按照文档中的描述一次连接到两者,并使用数据库对象选择要使用哪一个来设置查询。虽然老实说我真的认为你可能需要重新审视你的逻辑,因为在会话变量中设置数据库似乎是一种解决任何问题的陌生方式恕我直言。

但是,如果在您的控制器中,您读取了您的会话变量,请检查它是您系统的公认数据库,检查用户是否可以访问它,然后连接到它,应该可以正常工作。您不应该尝试访问配置文件中的会话数据,因为在读取配置文件时,会话数据可能无法使用。