データベース設定

注記

現在サポートされているデータベースドライバーについては、サポートされているデータベースを参照してください。

設定ファイル

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文字列を指定しない場合、CodeIgniterは残りの設定を使用してDSN文字列を作成しようとします。

DSNを指定する場合は、ドライバーの基になるネイティブなPHP拡張機能を使用する場合と同様に、'DSN'設定を使用する必要があります。

    // 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,
            ],
        ],
        // ...
    ];

    // ...
}

必要な数のフェイルオーバーを指定できます。

複数のデータベースの設定

複数の接続値セットを保存することもできます。たとえば、単一のインストールで複数の環境(開発、本番、テストなど)を実行する場合、各環境に接続グループを設定し、必要に応じてグループを切り替えることができます。たとえば、「test」環境を設定するには、次のようにします。

<?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';

ただし、環境変数を設定して新しいプロパティを追加したり、スカラー値を配列に変更したりすることはできません。詳細については、データの代替としての環境変数を参照してください。

したがって、MySQLでSSLを使用する場合は、ハックが必要です。たとえば、**.env**ファイルに配列値をJSON文字列として設定します。

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接続文字列(オールインワンの設定シーケンス)。

hostname

データベースサーバーのホスト名。多くの場合、「localhost」です。

username

データベースに接続するために使用されるユーザー名。(SQLite3では使用されません。)

password

データベースに接続するために使用されるパスワード。(SQLite3では使用されません。)

database

接続するデータベースの名前。

注記

CodeIgniterは、データベース、テーブル、列名にドット(.)をサポートしていません。

DBDriver

データベースドライバー名。大文字と小文字がドライバー名と一致する必要があります。カスタムドライバーを使用するには、完全修飾クラス名を設定できます。サポートされているドライバー:MySQLiPostgreSQLite3SQLSRVOCI8

DBPrefix

クエリビルダークエリを実行するときにテーブル名に追加されるオプションのテーブルプレフィックス。これにより、複数のCodeIgniterインストールが1つのデータベースを共有できます。

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 のみ)。

port

データベースポート番号 - デフォルトポートの場合空文字列''(またはSQLSRVによる動的ポート)。

foreignKeys

true/false(ブール値) - 外部キー制約を有効にするかどうか(SQLite3 のみ)。

重要

SQLite3の外部キー制約はデフォルトで無効になっています。SQLiteのドキュメントを参照してください。外部キー制約を適用するには、この設定項目をtrueに設定します。

busyTimeout

ミリ秒(int) - テーブルがロックされている場合、指定された時間だけスリープします(SQLite3 のみ)。

numberNative

true/false(ブール値) - MYSQLI_OPT_INT_AND_FLOAT_NATIVEを有効にするかどうか(MySQLi のみ)。

注記

使用しているデータベースドライバ(MySQLiPostgreなど)によって、必要な値は異なります。SQLite3を使用する場合は、ユーザー名やパスワードを指定する必要がなく、データベース名はデータベースファイルへのパスになります。