codeigniter 代码触发器:连接到SSL Amazon RDS数据库

but5z9lq  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(151)

我在从Codeigniter应用程序连接到Amazons RDS服务时遇到问题。
数据库配置中的设置:

$db['default']['ssl_set'] = TRUE;
$db['default']['ssl_key'] = NULL;
$db['default']['ssl_cert'] = NULL;
$db['default']['ssl_ca'] = realpath('./application/third_party/mysql-ssl-ca-cert.pem');
$db['default']['ssl_capath'] = NULL;
$db['default']['ssl_cipher'] = NULL;

然而,当我连接时,我得到消息:
无法选择指定的数据库:临时文件名:...\系统\数据库\DB_驱动程序. php行号:140
第40行如下所示:

// Select the DB... assuming a database name is specified in the config file
    if ($this->database != '')
    {
        if ( ! $this->db_select())
        {
            log_message('error', 'Unable to select database: '.$this->database);

            if ($this->db_debug)
            {
                $this->display_error('db_unable_to_select', $this->database); // LINE 140
            }
            return FALSE;
        }

我创建了following changes以使mysqli与SSL一起工作:
我很惊讶它连接成功,因为它抱怨数据库选择。不知道从这里去哪里?
我在Windows机器上使用PHP 5.3.8

更新

如果我把$db['default']['db_debug']设置为false,我就不会再遇到这个问题了。但是,我会收到一堆警告:

Severity: Warning
Message: mysqli_real_escape_string() [function.mysqli-real-escape-string]: invalid object or resource mysqli
Filename: mysqli/mysqli_driver.php
Line Number: 346

这意味着通过SSL与数据库的连接失败。

更新2

我使用的是XAMPP。
我使用的是CodeIniter 2.0.2。

更新3

我的数据库配置文件:

$db['default']['hostname'] = 'xxxx.us-east-1.rds.amazonaws.com';
$db['default']['username'] = 'xxxxx';
$db['default']['password'] = 'xxxx';
$db['default']['database'] = 'xxxx';
$db['default']['dbdriver'] = 'mysqli';
$db['default']['port'] = 3306;
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = true;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
$db['default']['ssl_set'] = true; 
$db['default']['ssl_key'] = NULL;
$db['default']['ssl_cert'] = NULL;
$db['default']['ssl_ca'] = realpath('./application/third_party/mysql-ssl-ca-cert.pem');
$db['default']['ssl_capath'] = NULL;
$db['default']['ssl_cipher'] = NULL;
hwamh0ep

hwamh0ep1#

$db['default']['port'] = 3306;

尝试将其添加到db config。mysql_real_connect()要求param 6为LONG int;不接受空字符串。

更新

DB_Driver中第140行下面的函数是设置dbcollat和charset的地方。它们将在驱动程序中命中真实的_escape,如果不正确,将导致escape_error。
尝试

$db['default']['dbcollat']='';

或者,检查您的数据库的编码设置是否与您的数据库配置中的内容相对应。例如,如果您的数据库字符集为latin 1,而您使用的是utf-8,则conn_id将是错误的,mysqli_escape将停止。

bfnvny8b

bfnvny8b2#

如果使用的Codeigniter 3.* 配置数据库文件不同:

$db['default']['encrypt']['ssl_set'] = true;
$db['default']['encrypt']['ssl_key'] = NULL;
$db['default']['encrypt']['ssl_cert'] = NULL;
$db['default']['encrypt']['ssl_ca'] = realpath('./application/third_party/sert/CA.pem');
$db['default']['encrypt']['ssl_capath'] = NULL;
$db['default']['encrypt']['ssl_cipher'] = NULL;
lvjbypge

lvjbypge3#

在Codeigniter 4中,必须更新app/Config/Database.php文件中$default变量中encrypt的值。

'encrypt'  => [
  'ssl_key' => NULL,
  'ssl_cert' => NULL,
  'ssl_verify' => FALSE,
  'ssl_ca' => '',
  'ssl_capath' => NULL,
  'ssl_cipher' => NULL
]

然后,如果需要,您可以使用.env文件更改一些值。

database.default.encrypt.ssl_verify = true
database.default.encrypt.ssl_ca = './application/third_party/sert/CA.pem'

注意:任何需要在.env文件中更新的值都必须在app/Config/Database.php文件中设置。您可以将其设置为空字符串、falseNULL

相关问题