数据库配置

注意

请参阅 支持的数据库 以了解当前支持的数据库驱动程序。

配置文件

CodeIgniter 拥有一个配置文件,允许您存储数据库连接值(用户名、密码、数据库名称等)。配置文件位于 **app/Config/Database.php**。您也可以在 **.env** 文件中设置数据库连接值。有关更多详细信息,请参见下文。

设置默认数据库

配置文件设置存储在一个类属性中,该属性是一个具有以下原型的数组

<?php

namespace Config;

use CodeIgniter\Database\Config;

class Database extends Config
{
    // ...

    public array $default = [
        'DSN'      => '',
        'hostname' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'database_name',
        'DBDriver' => 'MySQLi',
        'DBPrefix' => '',
        'pConnect' => false,
        'DBDebug'  => true,
        'charset'  => 'utf8',
        'DBCollat' => 'utf8_general_ci',
        'swapPre'  => '',
        'encrypt'  => false,
        'compress' => false,
        'strictOn' => false,
        'failover' => [],
        'port'     => 3306,
    ];

    // ...
}

类属性的名称是连接名称,可以在连接时使用以指定组名。

注意

SQLite3 数据库的默认位置在 **writable** 文件夹中。如果您想更改位置,则必须设置新文件夹的完整路径。

DSN

某些数据库驱动程序(如 Postgre、OCI8)需要完整的 DSN 字符串才能连接。但是,如果您没有为需要 DSN 字符串的驱动程序指定 DSN 字符串,CodeIgniter 将尝试使用提供的其他设置构建它。

如果您指定 DSN,则应使用 'DSN' 配置设置,就像使用驱动程序的底层原生 PHP 扩展一样,例如

    // OCI8
    public array $default = [
        'DSN' => '///XE',
        // ...
    ];
通用方式的 DSN

您也可以以通用方式(类似 URL)设置数据源名称。在这种情况下,DSN 必须具有以下原型

    public array $default = [
        'DSN' => 'DBDriver://username:password@hostname:port/database',
        // ...
    ];

要使用 DSN 字符串的通用版本连接时覆盖默认配置值,请将配置变量添加为查询字符串

    // MySQLi
    public array $default = [
        'DSN' => 'MySQLi://username:password@hostname:3306/database?charset=utf8&DBCollat=utf8_general_ci',
        // ...
    ];
    // Postgre
    public array $default = [
        'DSN' => 'Postgre://username:password@hostname:5432/database?charset=utf8&connect_timeout=5&sslmode=1',
        // ...
    ];

注意

如果您提供 DSN 字符串,但它缺少某些有效设置(例如,数据库字符集),而这些设置在其他配置字段中存在,CodeIgniter 将追加它们。

故障转移

您还可以为以下情况指定故障转移:当主连接由于某种原因无法连接时。可以通过为连接设置故障转移来指定这些故障转移,如下所示

<?php

namespace Config;

use CodeIgniter\Database\Config;

class Database extends Config
{
    // ...

    public array $default = [
        // ...
        'failover' => [
            [
                'hostname' => 'localhost1',
                'username' => '',
                'password' => '',
                'database' => '',
                'DBDriver' => 'MySQLi',
                'DBPrefix' => '',
                'pConnect' => true,
                'DBDebug'  => true,
                'charset'  => 'utf8',
                'DBCollat' => 'utf8_general_ci',
                'swapPre'  => '',
                'encrypt'  => false,
                'compress' => false,
                'strictOn' => false,
            ],
            [
                'hostname' => 'localhost2',
                'username' => '',
                'password' => '',
                'database' => '',
                'DBDriver' => 'MySQLi',
                'DBPrefix' => '',
                'pConnect' => true,
                'DBDebug'  => true,
                'charset'  => 'utf8',
                'DBCollat' => 'utf8_general_ci',
                'swapPre'  => '',
                'encrypt'  => false,
                'compress' => false,
                'strictOn' => false,
            ],
        ],
        // ...
    ];

    // ...
}

您可以根据需要指定任意数量的故障转移。

设置多个数据库

您可以选择存储多组连接值。例如,如果您在一个安装中运行多个环境(开发、生产、测试等),您可以为每个环境设置一个连接组,然后根据需要在组之间切换。例如,要设置“测试”环境,您将执行以下操作

<?php

namespace Config;

use CodeIgniter\Database\Config;

class Database extends Config
{
    // ...

    public array $test = [
        'DSN'      => '',
        'hostname' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'database_name',
        'DBDriver' => 'MySQLi',
        'DBPrefix' => '',
        'pConnect' => true,
        'DBDebug'  => true,
        'charset'  => 'utf8',
        'DBCollat' => 'utf8_general_ci',
        'swapPre'  => '',
        'compress' => false,
        'encrypt'  => false,
        'strictOn' => false,
        'failover' => [],
    ];

    // ...
}

然后,要全局告诉系统使用该组,您需要设置位于配置文件中的此变量

<?php

namespace Config;

use CodeIgniter\Database\Config;

class Database extends Config
{
    // ...

    public string $defaultGroup = 'test';

    // ...
}

注意

名称 test 是任意的。它可以是您想要的任何东西。默认情况下,我们对主连接使用了 default 这个词,但它也可以重命名为与您的项目更相关的名称。

自动更改数据库

您可以修改配置文件以检测环境并自动将 defaultGroup 值更新为正确的值,方法是在类的构造函数中添加所需的逻辑

<?php

namespace Config;

use CodeIgniter\Database\Config;

/**
 * Database Configuration
 */
class Database extends Config
{
    // ...
    public $development = [/* ... */];
    public $test        = [/* ... */];
    public $production  = [/* ... */];

    public function __construct()
    {
        // ...

        $this->defaultGroup = ENVIRONMENT;
    }
}

使用 .env 文件配置

您还可以将配置值保存在带有当前服务器数据库设置的 .env 文件中。您只需要输入与默认组配置设置不同的值。这些值应该遵循以下格式的名称,其中 default 是组名

database.default.username = 'root';
database.default.password = '';
database.default.database = 'ci4';

但是您不能通过设置环境变量来添加新属性,也不能将标量值更改为数组。有关详细信息,请参阅 环境变量作为数据的替换

因此,如果您想使用 SSL 与 MySQL,则需要一个技巧。例如,将数组值作为 JSON 字符串设置在您的 .env 文件中

database.default.encrypt = {"ssl_verify":true,"ssl_ca":"/var/www/html/BaltimoreCyberTrustRoot.crt.pem"}

并在 Config 类中的构造函数中对其进行解码

<?php

namespace Config;

use CodeIgniter\Database\Config;

/**
 * Database Configuration
 */
class Database extends Config
{
    // ...

    public function __construct()
    {
        // ...

        $array = json_decode($this->default['encrypt'], true);
        if (is_array($array)) {
            $this->default['encrypt'] = $array;
        }
    }
}

值说明:

名称配置

描述

DSN

DSN 连接字符串(一个全面的配置序列)。

主机名

数据库服务器的主机名。通常是“localhost”。

用户名

用于连接到数据库的用户名。(SQLite3 不使用它。)

密码

用于连接到数据库的密码。(SQLite3 不使用它。)

数据库

您要连接到的数据库的名称。

注意

CodeIgniter 不支持数据库、表和列名称中的点 (.)。

DBDriver

数据库驱动程序名称。大小写必须与驱动程序名称匹配。您可以设置一个完全限定的类名来使用您的自定义驱动程序。支持的驱动程序:MySQLiPostgreSQLite3SQLSRVOCI8

DBPrefix

一个可选的表前缀,它将在运行 查询构建器 查询时添加到表名中。这允许多个 CodeIgniter 安装共享一个数据库。

pConnect

true/false(布尔值) - 是否使用持久连接。

DBDebug

true/false(布尔值) - 当数据库错误发生时是否抛出异常。

charset

与数据库通信时使用的字符集。

DBCollat

与数据库通信时使用的字符排序规则 (MySQLi 仅限)。

swapPre

一个默认的表前缀,应该与 DBPrefix 交换。这对于分布式应用程序很有用,在这些应用程序中,您可能运行手动编写的查询,并且需要前缀仍然可以由最终用户自定义。

schema

数据库模式,默认值因驱动程序而异。(由 PostgreSQLSRV 使用。)

encrypt

是否使用加密连接。 SQLSRV 驱动程序接受 true/false MySQLi 驱动程序接受一个包含以下选项的数组:* ssl_key - 私钥文件路径 * ssl_cert - 公钥证书文件路径 * ssl_ca - 证书颁发机构文件路径 * ssl_capath - 包含 PEM 格式的受信任 CA 证书的目录路径 * ssl_cipher - 允许用于加密的密码列表,用冒号 (:) 分隔 * ssl_verify - true/false;是否验证服务器证书 (MySQLi 仅限)

compress

是否使用客户端压缩 (MySQLi 仅限)。

strictOn

true/false(布尔值) - 是否强制“严格模式”连接,这对于在开发应用程序时确保严格的 SQL 很有用 (MySQLi 仅限)。

端口

数据库端口号 - 空字符串 '' 表示默认端口(或使用 SQLSRV 时使用动态端口)。

外键

true/false(布尔值) - 是否启用外键约束(仅限 SQLite3)。

重要

SQLite3 外键约束默认情况下是禁用的。请参阅 SQLite 文档。要强制执行外键约束,请将此配置项设置为 true。

繁忙超时

毫秒(int) - 当表被锁定时休眠指定的时间(仅限 SQLite3)。

原生数字

true/false(布尔值) - 是否启用 MYSQLI_OPT_INT_AND_FLOAT_NATIVE(仅限 MySQLi)。

注意

根据您使用的数据库驱动程序(MySQLiPostgre 等),并非所有值都需要。例如,使用 SQLite3 时,您无需提供用户名或密码,数据库名称将是数据库文件的路径。