Welcome Guest, Not a member yet? Register   Sign In
DB can't recognize an Array parameter
#1

[eluser]bbiao[/eluser]
In CI 1.6.1 database/DB.php
Code:
function &DB;($params = '', $active_record_override = FALSE)
{
    // Load the DB config file if a DSN string wasn't passed
    if (is_string($params) AND strpos($params, '://') === FALSE)
    {
        include(APPPATH.'config/database'.EXT);
        
        if ( ! isset($db) OR count($db) == 0)
        {
            show_error('No database connection settings were found in the database config file.');
        }
        
        if ($params != '')
        {
            $active_group = $params;
        }
        
        if ( ! isset($active_group) OR ! isset($db[$active_group]))
        {
            show_error('You have specified an invalid database connection group.');
        }
        
        $params = $db[$active_group];            
    }
    else
    {
        
        /* parse the URL from the DSN string
        *  Database settings can be passed as discreet
         *  parameters or as a data source name in the first
         *  parameter. DSNs must have this prototype:
         *  $dsn = 'driver://username:password@hostname/database';
        */
    
        if (($dns = @parse_url($params)) === FALSE)
        {
            show_error('Invalid DB Connection String');
        }
        
        $params = array(
                            'dbdriver'    => $dns['scheme'],
                            'hostname'    => (isset($dns['host'])) ? rawurldecode($dns['host']) : '',
                            'username'    => (isset($dns['user'])) ? rawurldecode($dns['user']) : '',
                            'password'    => (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '',
                            'database'    => (isset($dns['path'])) ? rawurldecode(substr($dns['host'], 1)) : ''
                        );
    }
    
    // No DB specified yet?  Beat them senseless...
    if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '')
    {
        show_error('You have not selected a database type to connect to.');
    }

    // Load the DB classes.  Note: Since the active record class is optional
    // we need to dynamically create a class that extends proper parent class
    // based on whether we're using the active record class or not.
    // Kudos to Paul for discovering this clever use of eval()
    
    if ($active_record_override == TRUE)
    {
        $active_record = TRUE;
    }
    
    require_once(BASEPATH.'database/DB_driver'.EXT);

    if (! isset($active_record) OR $active_record == TRUE)
    {
        require_once(BASEPATH.'database/DB_active_rec'.EXT);
        
        if ( ! class_exists('CI_DB'))
        {
            eval('class CI_DB extends CI_DB_active_record { }');
        }
    }
    else
    {
        if ( ! class_exists('CI_DB'))
        {
            eval('class CI_DB extends CI_DB_driver { }');
        }
    }
            
    require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver'.EXT);

    // Instantiate the DB adapter
    $driver = 'CI_DB_'.$params['dbdriver'].'_driver';
    $DB =& new $driver($params);
    
    if ($DB->autoinit == TRUE)
    {
        $DB->initialize();
    }
    
    return $DB;
}

and in Database Configuration Docs, CI tell us:
Quote:To connect manually to a desired database you can pass an array of values:
$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;

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

But what happened when I just do the docs told me what to do? CI can't connect to the database, since it can not get the database configuration correctly. Corresponding to the code, the DB function just support two kind of parameter '$params', that is
1.config group name
2.DSN name

if you pass a config array, it will be used as a DSN name, and you can' t connect to the db.
#2

[eluser]bbiao[/eluser]
what should we do is just leave it when the $param is a array type. and the code should changed to
Code:
function &DB;($params = '', $active_record_override = FALSE)
{
    if (is_string($params)) {
        // Load the DB config file if a DSN string wasn't passed
        if (strpos($params, '://') === FALSE)
        {
            include(APPPATH.'config/database'.EXT);
            
            if ( ! isset($db) OR count($db) == 0)
            {
                show_error('No database connection settings were found in the database config file.');
            }
            
            if ($params != '')
            {
                $active_group = $params;
            }
            
            if ( ! isset($active_group) OR ! isset($db[$active_group]))
            {
                show_error('You have specified an invalid database connection group.');
            }
            
            $params = $db[$active_group];            
        }
        else
        {
            
            /* parse the URL from the DSN string
            *  Database settings can be passed as discreet
             *  parameters or as a data source name in the first
             *  parameter. DSNs must have this prototype:
             *  $dsn = 'driver://username:password@hostname/database';
            */
        
            if (($dns = @parse_url($params)) === FALSE)
            {
                show_error('Invalid DB Connection String');
            }
            
            $params = array(
                                'dbdriver'    => $dns['scheme'],
                                'hostname'    => (isset($dns['host'])) ? rawurldecode($dns['host']) : '',
                                'username'    => (isset($dns['user'])) ? rawurldecode($dns['user']) : '',
                                'password'    => (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '',
                                'database'    => (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : ''
                            );
        }
    } else if (is_array($params)) {
        // JUST DO NOTHING
    }
    
    // No DB specified yet?  Beat them senseless...
    if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '')
    {
        show_error('You have not selected a database type to connect to.');
    }

    // Load the DB classes.  Note: Since the active record class is optional
    // we need to dynamically create a class that extends proper parent class
    // based on whether we're using the active record class or not.
    // Kudos to Paul for discovering this clever use of eval()
    
    if ($active_record_override == TRUE)
    {
        $active_record = TRUE;
    }
    
    require_once(BASEPATH.'database/DB_driver'.EXT);

    if (! isset($active_record) OR $active_record == TRUE)
    {
        require_once(BASEPATH.'database/DB_active_rec'.EXT);
        
        if ( ! class_exists('CI_DB'))
        {
            eval('class CI_DB extends CI_DB_active_record { }');
        }
    }
    else
    {
        if ( ! class_exists('CI_DB'))
        {
            eval('class CI_DB extends CI_DB_driver { }');
        }
    }
            
    require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver'.EXT);

    // Instantiate the DB adapter
    $driver = 'CI_DB_'.$params['dbdriver'].'_driver';
    $DB =& new $driver($params);
    
    if ($DB->autoinit == TRUE)
    {
        $DB->initialize();
    }
    
    return $DB;
}
#3

[eluser]Derek Jones[/eluser]
Thanks for reporting, bbiao, but this was addressed in the SVN a few months ago. Wink You can apply your fix to 1.6.1 or checkout the latest revision for the "official" fix.
#4

[eluser]bbiao[/eluser]
[quote author="Derek Jones" date="1210013331"]Thanks for reporting, bbiao, but this was addressed in the SVN a few months ago. Wink You can apply your fix to 1.6.1 or checkout the latest revision for the "official" fix.[/quote]

it's cool




Theme © iAndrew 2016 - Forum software by © MyBB