Я использую PHP с PDO для подключения к моей базе данных.
Я хочу начать использовать переменные среды, поэтому я использовал следующую команду терминала:
composer require vlucas/phpdotenv
Мой файл .env теперь содержит следующие значения:
DATABASE_HOSTNAME=db
DATABASE_NAME=myDb
DATABASE_USERNAME=user
DATABASE_PASSWORD=test
Мой тестовый файл подключения к базе данных выглядит следующим образом:
<?php
require_once __DIR__ . "/vendor/autoload.php";
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$host = getenv("DATABASE_HOSTNAME");
$dbname = getenv("DATABASE_NAME");
$dbuser = getenv("DATABASE_USERNAME");
$dbpass = getenv("DATABASE_PASSWORD");
try{
$dbc = new PDO("mysql:dbname=$dbname;host=$host;port=3306", $dbuser, $dbpass);
$dbc->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo "Conneciton failed: " . $e->getMessage() . "<br/>";
}
?>
Я получаю следующую ошибку:
Conneciton failed: SQLSTATE[HY000] [2002] No such file or directory
Я добавил этот код в файл подключения к тестовой базе данных:
echo "X" . getenv('X');
echo "host is " . $host;
В терминале ввожу: php test.php
И это звучит следующим образом:
Xhost is %
Вот скриншот:
Что я делаю не так?
если вы используете php с Apache в качестве веб-сервера, я бы использовал доступные там встроенные переменные env вместо внешней библиотеки в php. таким образом вокруг не будет файлов .env
Не имеет отношения к вашей проблеме, но getenv
возвращает false
, если переменная не существует, и когда вы объединяете ее со строкой X
, она преобразуется в пустую строку ""
. Судя по вашему мнению, вы это знаете, но я просто хотел предупредить вас, что это может привести к определенному безумию при отладке, особенно если вам нужно поддерживать пустые переменные ENV (по какой-либо причине).
@Мэтью, я внес это изменение, и теперь оно работает. Примечание: это та часть программирования, которая меня раздражает; постоянные (а иногда и ненужные) изменения в синтаксисе, устаревания и т. д. Хотя я понимаю, что это часть области технологий, меня это крайне раздражает. Я должен был стать шеф-поваром. Кстати, вы хотели опубликовать ответ? Я приму это.
Это хорошая гарантия занятости: половина вашего времени уходит на исправление того, что уже работает.
Это связано с тем, что getenv
и putenv
по умолчанию не заполняются библиотекой Dotenv.
Вместо этого следует использовать $_ENV
для чтения переменных при использовании функции createImmutable
, в противном случае ознакомьтесь с документацией по адресу https://github.com/vlucas/phpdotenv?tab=readme-ov-file#putenv-and-getenv
Вероятно, актуально в вашем случае: github.com/vlucas/…. Доктор, не используйте
getenv
, а вместо этого используйте$_ENV[...]
.