Подключение к базе данных CodeIgniter во время выполнения

У меня все еще возникают проблемы с ручным подключением к базе данных во время выполнения. Я открываю новый вопрос, потому что еще не нашел ответа.

Вот случай,

Я подключаюсь к базе данных с пользователем подключения, чтобы проверить имя пользователя и пароль, введенные в форму. Затем с этой новой информацией, если пользователь действителен, я должен подключиться к базе данных с этим новым именем пользователя и паролем. Внешний вид содержит следующее:

конфиг/база данных.php

    $active_record = TRUE;
    $db['default']['hostname'] = 'host';
    $db['default']['username'] = 'username';
    $db['default']['password'] = 'pwd';
    $db['default']['database'] = 'dbname';
    $db['default']['dbdriver'] = 'oci8';
    $db['default']['dbprefix'] = '';
    $db['default']['pconnect'] = FALSE;
    $db['default']['db_debug'] = TRUE;
    $db['default']['cache_on'] = FALSE;
    $db['default']['cachedir'] = '';
    $db['default']['char_set'] = 'WE8ISO8859P1';
    $db['default']['dbcollat'] = '';
    $db['default']['swap_pre'] = '';
    $db['default']['autoinit'] = FALSE;
    $db['default']['stricton'] = FALSE;

Затем в контроллере входа: controllers/login.php

public function __construct(){
    parent::__construct();
    $this->output->enable_profiler(TRUE);

    $this->CI =& get_instance();
    $this->db_con = $this->CI->load->database('default', FALSE, TRUE);

    $this->load->model('Login_model');
    session_start();

}

public function index(){                
    if (isset($_POST['ingresar'])){

        $d['data'] = $this->Login_model->Obtener_usuario($_POST['usuario']);

        $_SESSION['logueo'] = $d['data']->row();

        if (empty($_SESSION['logueo'])){
            $d['error'] = 2;
        }
        else{
            if (is_null($_SESSION['logueo']->USER_ORACLE)){
                $d['error'] = 1;
            }
            if (!is_null($_SESSION['logueo']->N_SECUENCIA)){
                cargar_var_sesion($_POST['usuario'], $_SESSION['logueo']->USER_ORACLE, $_SESSION['logueo']->N_SECUENCIA, $_SESSION['logueo']->C_USR_NOM_APE);

                $db['limited']['hostname'] = 'samehost';
                $db['limited']['username'] = $_POST['usuario'];
                $db['limited']['password'] = $_POST['clave'];
                $db['limited']['database'] = 'samedbname';
                $db['limited']['dbdriver'] = 'oci8';
                $db['limited']['dbprefix'] = '';
                $db['limited']['pconnect'] = FALSE;
                $db['limited']['db_debug'] = TRUE;
                $db['limited']['cache_on'] = FALSE;
                $db['limited']['cachedir'] = '';
                $db['limited']['char_set'] = 'WE8ISO8859P1';
                $db['limited']['dbcollat'] = '';
                $db['limited']['swap_pre'] = '';
                $db['limited']['autoinit'] = FALSE;
                $db['limited']['stricton'] = FALSE;

                $active_group = 'limited';

                $this->db = $this->CI->load->database('limited', FALSE, TRUE);                  
                redirect('inicio', 'location');
            }
            else{
                $d['error'] = 2;    
            }
        }           
    }
    else{
        $d['error'] = 0;    
    }

    $this->load->view('/componentes/header');
    $this->load->view('/componentes/menu_sin_login');
    $this->load->view('/login/login', $d);
    $this->load->view('/componentes/footer');       
}

В этом контроллере все идет нормально, но когда выполняется перенаправление (которое загружает разные модели), например, tareas_model.php, я продолжаю получать ту же ошибку в первых строках:

модели /tareas_model.php

function __construct()
{
    parent::__construct();
    $query = $this->db->query('ALTER SESSION SET nls_sort = \'SPANISH\'');
}

Ошибка:

A PHP Error was encountered
Severity: Notice
Message: Undefined property: Inicio::$db
Filename: core/Model.php
Line Number: 50
Fatal error: Call to a member function query() on a non-object in /var/www/crm/application/models/tareas_model.php on line 8

Я также пытался установить $this->db в качестве переменной сеанса, но я продолжаю получать ту же ошибку, и я схожу с ума. Я перепробовал все, что нашел в Интернете, но безрезультатно.

Любая помощь?


person Veronica    schedule 30.08.2011    source источник
comment
Здравствуйте друзья! Кто-нибудь знает об этом? Мне это очень нужно для работы. Заранее спасибо!   -  person Veronica    schedule 04.09.2011


Ответы (2)


Ну а для тех кто сталкивался с этой проблемой думаю нашел решение. Я изменил файлы следующим образом:

конфиг/база данных.php

$active_record = TRUE;
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = '';
$db['default']['dbdriver'] = 'oci8';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'WE8ISO8859P1';
$db['default']['dbcollat'] = '';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = FALSE;
$db['default']['stricton'] = FALSE;

Затем контроллер, который первым получает имя пользователя и пароль POST, как: controllers/login.php

public function __construct()
{
    parent::__construct();
    $this->output->enable_profiler(TRUE);
    session_start();

}

public function index()
{               
    if (isset($_POST['ingresar'])){

        if (!empty($_POST['usuario']) && !empty($_POST['clave'])){

            $c['hostname'] = "myhost";
            $c['username'] = strtoupper($_POST['usuario']);
            $c['password'] = $_POST['clave'];
            $c['database'] = "dbname";
            $c['dbdriver'] = "oci8";
            $c['dbprefix'] = "";
            $c['pconnect'] = TRUE;
            $c['db_debug'] = TRUE;
            $c['cache_on'] = FALSE;
            $c['cachedir'] = "";
            $c['char_set'] = "WE8ISO8859P1";
            $c['dbcollat'] = ""; 
            $active_record = TRUE;

            $_SESSION['c'] = $c;

            $this->db = $this->load->database($_SESSION['c'], TRUE, TRUE);
            $this->load->model('Login_model');

            $d['data'] = $this->Login_model->Obtener_usuario($_POST['usuario']);

            $_SESSION['logueo'] = $d['data']->row(); //print_r($_SESSION['logueo']);
            cargar_var_sesion($_SESSION['logueo']->C_USUARIO_WEB, $_SESSION['logueo']->USER_ORACLE, $_SESSION['logueo']->C_USR_NOM_APE, $this->db->conn_id, $_SESSION['c']);
            redirect('inicio', 'location');

        }
        else{
            $d['error'] = 1;

            $this->load->view('/componentes/header');
            $this->load->view('/componentes/menu_sin_login');
            $this->load->view('/login/login', $d);
            $this->load->view('/componentes/footer');
        }           
    }
    else{
        $d['error'] = 0;

        $this->load->view('/componentes/header');
        $this->load->view('/componentes/menu_sin_login');
        $this->load->view('/login/login', $d);
        $this->load->view('/componentes/footer');   
    }

}

Затем в моделях: models/login_model.php

function __construct()
{
    parent::__construct();
    $CI =& get_instance();
}
function Obtener_usuario($usuario) 
{
    $CI =& get_instance();
    $query_logueo = $CI->db->query('SELECT....');
    return $query_logueo;
}

Затем в каждом контроллере я перезагружаю базу данных, например:

public function __construct()
{
    parent::__construct();
    $this->output->enable_profiler(TRUE);

    session_start();

    $this->db = $this->load->database($_SESSION['c'], TRUE, TRUE);
    $this->load->model('Any_model');
}

Незначительные, где всего несколько в каждом контроллере и ни одного в моделях, так что это было здорово!

С уважением, В.

person Veronica    schedule 06.09.2011

это для изменения конфигурации БД во время выполнения... кажется, что вы перехватываете имя хоста из URL-адреса.... и в соответствии с этим вам нужно изменить конфигурацию БД...

1st>

class yourcontrollername extends CI_Controller 

{

public function index($do='')
    {

//declare seesion or catch a url parameter's value in session

      if(isset($_GET['qual']))  //Qual is parameter name which is supplied in url
    {
       session_start();
       $_SESSION['Company'] = $_GET['qual'];


    }

public function delx($id)
    {
        session_start();
        $Scompany = $_SESSION['Company'];

    $this->load->helper('url');
    $server_url = site_url('api');

    $this->load->library('xmlrpc');

    $this->xmlrpc->server($server_url, 80);
    $this->xmlrpc->method('delx_order_delete');
    $request = array();
    $request = array("id"=>$id , "Param"=>$Scompany);


    $this->xmlrpc->request(array(array($request,'struct')));

    $this->load->library('session');

    $sess = array();

    if ( ! $this->xmlrpc->send_request()){
        $sess['err'] = $this->xmlrpc->display_error();
    }else{
        $resl = $this->xmlrpc->display_response();
        if($resl['failure'] != ''){
            $sess['err'] = $resl['failure'];
        }
        if($resl['success'] != ''){
            $sess['succ'] = $resl['success'];
            $output = $this->session->userdata('output');
            if(is_array($output)){
                foreach($output as $key=>$valo){
                    if($valo['ID'] == $id){
                        unset($output[$key]);
                    }
                }
            }
        }
        $this->session->set_userdata($sess);
        $this->session->set_userdata(array('output'=>$output));
    }


}


     }



}

Теперь на Api.model

function x_order_delete($params)
{
    $compname = $params['Param'];

    if($compname == 'xyz.con')

    {

        $c['hostname'] = $compname;
        $c['username'] = "username";
        $c['password'] = "password";
        $c['database'] = "db name";
        $c['dbdriver'] = "mysql";
        $c['dbprefix'] = "";
        $c['pconnect'] = TRUE;
        $c['db_debug'] = TRUE;
        $c['cache_on'] = FALSE;
        $c['cachedir'] = '';
        $c['char_set'] = 'utf8';
        $c['dbcollat'] = 'utf8_general_ci';
        $c['swap_pre'] = '';
        $c['autoinit'] = TRUE;
        $c['stricton'] = FALSE;

        $_SESSION['c'] = $c;


        $this->db = $this->load->database($_SESSION['c'], TRUE, TRUE);

        //$this->load->database();

    if($query = $this->db->query('DELETE FROM table
                               Where ID = '.$params['id'])){

        return array("Successfully deleted record.","");
    } else {
        return array("","Error deleting record.");
    }
    return $query;
  }
}

вот и все.... надеюсь, это поможет вам.... Удачи

person Death    schedule 10.04.2012