Отделение конфигурации базы данных от соединения - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь установить соединение с базой данных, когда информация о конфигурации базы данных удалена от соединения.

Это код, который я написал

Информация о конфигурации базы данных:

$config = array(
"database" => array(
   "host" => "host",
   "username" => "username",
   "password" => "password",
   "name" => "name",
)
);

define("databse_config", $config["database"]);

$ config обычно также содержит другую информацию, не относящуюся к данному вопросу, поэтому я определил «database_config».

подключение к базе данных:


require_once "config.php";
define("DB_HOST", databse_config['host']);
define("DB_USERNAME", databse_config['username']);
define("DB_PASSWORD", databse_config['password']);
define("DB_NAME", databse_config['name']);

function connect()
{
    $dbhost = DB_HOST;
    $dbuser = DB_USERNAME;
    $dbpass = DB_PASSWORD;
    $dbname = DB_NAME;

    try {
        $conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
        $conn->exec("set names utf8");
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $conn;
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
}

connect();

Проблема, с которой я продолжаю работать, заключается в том, что я пытаюсь выполнить функцию, которую страница продолжает загружать, и в итоге выдает следующую ошибку:

Ошибка подключения: SQLSTATE [HY000 ] [2002] Тайм-аут соединения

Я довольно новичок в PDO, поэтому я тоже попробовал то же самое при использовании mysqli, который дал тот же результат.

Любая помощь будет принята с благодарностью .

1 Ответ

1 голос
/ 19 марта 2020

Не удалось установить соединение: SQLSTATE [HY000] [2002] Превышено время ожидания соединения

Это означает, что php попытался установить sh соединение TCP / IP с сервером базы данных И НЕ удалось , Вы указали DB_HOST имя хоста, которое недоступно по сети из местоположения вашей php программы.

Возможно, отсутствует значение имени хоста или оно неверно. Если вы указали его по имени (mysql-server.example.com), это сообщение об ошибке сообщит вам, что поиск DNS-имени выполнен успешно.

Итак, ваш php отправляет запрос на сервер для подключения TCP / IP. На этот запрос никогда не приходит ответ. Это означает, что где-то есть брандмауэр, блокирующий соединение, или отсутствует сетевой маршрут от вашей php программы к сети.

Все это означает, что значение $dbhost неверно в вашей операции new PDO().

Ваш код может быть значительно упрощен без потери модульности. sprintf() помогает. Проще лучше для устранения неполадок.

require_once "config.php";
function connect()
{
    try {
        $connectionString = sprintf ("mysql:host=%s;dbname=%s", 
                                      database_config['host'],
                                      database_config['name']);
        $conn = new PDO($connectionString, 
                        database_config['username'],
                        database_config['password']);
        $conn->exec("set names utf8");
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $conn;
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
}    
connect();

И вы можете echo $connectionString; посмотреть, что в нем, и убедиться, что это не что-то странное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...