環境変数を利用してデータベース接続の管理をしたいのですが上手く読み込まれません

投稿者: Anonymous

実現したいこと
環境変数を利用してデータベースの接続を管理したい

行ったこと
phpdotenvをインストール

.envファイルの作成(接続内容記入済み)

各接続名の確認

gitignoreにenvファイルを記載

エラー内容がこちらになります。
原文

Fatal error: Uncaught DotenvExceptionInvalidPathException: Unable to read any of the environment file(s) at [/app/.env]. in /app/vendor/vlucas/phpdotenv/src/Store/FileStore.php:68 Stack trace: #0 /app/vendor/vlucas/phpdotenv/src/Dotenv.php(222): DotenvStoreFileStore->read() #1 /app/connect.php(7): DotenvDotenv->load() #2 /app/index.php(9): connect() #3 {main} thrown in /app/vendor/vlucas/phpdotenv/src/Store/FileStore.php on line 68

翻訳

致命的なエラー:キャッチされていないDotenv  Exception  InvalidPathException:[/ app/.env]にある環境ファイルを読み取ることができません。 /app/vendor/vlucas/phpdotenv/src/Store/FileStore.php:68スタックトレース:#0 /app/vendor/vlucas/phpdotenv/src/Dotenv.php(222):Dotenv  Store  FileStore-> read ()#1 /app/connect.php(7):Dotenv  Dotenv-> load()#2 /app/index.php(9):connect()#3{main}が/ app / vendor / vlucasにスローされます /phpdotenv/src/Store/FileStore.php(68行目)

画像の説明をここに入力

上記のコード

<?php
require __DIR__ . '/vendor/autoload.php';
function connect()
{
    try {
        $dotenv = DotenvDotenv::createImmutable(__DIR__);
        $dotenv->load();

        $dbHost = $_ENV['DB_HOST'];
        $dbUsername = $_ENV['DB_USERNAME'];
        $dbPassword = $_ENV['DB_PASSWORD'];
        $dbDatabase = $_ENV['DB_DATABASE'];

        $db = new PDO("mysql:dbname={$dbDatabase}, host={$dbHost}, charset=utf8, {$dbUsername}, {$dbPassword}");
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    } catch (PDOException $Exception) {
        die('DB接続エラー: ' . $Exception->getMessage());
    }
    return $db;
}

調べても中々答えを考えられずどうしたらよいのか分からずにいます。
何かヒントや気付きでもよいのでご回答いただけないでしょうか。
何卒よろしくお願いいたします。

2021/02/02 追記
.envファイルの内容です。
下記に記入した項目は、heroku configで表示させたデータベース情報を元にしました。

DB_HOST="ホスト名"
DB_USERNAME="ユーザー名"
DB_PASSWORD="パスワード名"
DB_DATABASE="データベース名"

エラー発生後、.envファイルを確認した際データベース名が間違えていたので修正したのですが解決できませんでした。

追記
heroku側での設定です。

画像の説明をここに入力

解決

dotenvの使い方としては、例えばローカル環境のDB接続用のデータを入れておいて、本番サーバなどではホスティングの環境変数(HerokuでいうところのConfig Vars)を利用することで上書きするというやり方が一般的です。
dotenvの環境変数とホスティングの環境変数両方あった場合ではホスティングの環境変数が優先して利用される仕組みです。

そのためローカル環境の接続情報でしたらdotenvファイル自体はignoreせずにgitにプッシュしてしまって運用しても問題ないと思います。

またローカル環境が必要ない & アプリを動作環境に環境変数が設定できるのであれば、そもそもdotenvを利用する必要はないでしょう。
Herokuであれば

getenv('XXXXX')

で取得できるでしょう。

参考: 環境設定を定義する

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *