Разделяне на конфигурацията на базата данни от връзката

Опитвам се да осъществя връзка с базата данни, докато информацията за конфигурацията на базата данни е отделена от връзката.

Това е кодът, който написах

db конфигурационна информация:

$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, което даде същия резултат.

Всяка помощ ще бъде оценена.


person Kjvhout    schedule 19.03.2020    source източник
comment
Имам чувството, че сте прекалили с раздялата си. не са ли два блока с дефиниции на константи и три блока с дефиниции на променливи твърде много за задачата? Не можете ли просто да използвате databse_config вътре в connect()?   -  person Your Common Sense    schedule 19.03.2020
comment
Здравейте, вече се опитах да направя това. Също така се опитах да стартирам кода, без да е функция и все още няма да работи.   -  person Kjvhout    schedule 19.03.2020
comment
Точно. Така че въпросът ви не е как да се разделите, а как да поправите грешката?   -  person Your Common Sense    schedule 19.03.2020
comment
Да точно. Трябваше да съм по-конкретен със заглавието.   -  person Kjvhout    schedule 19.03.2020


Отговори (1)


Връзката е неуспешна: SQLSTATE[HY000] [2002] Времето за изчакване на връзката е изтекло

Това означава, че php се е опитал да установи 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; да видите какво има в него и да се уверите, че не е нещо странно.

person O. Jones    schedule 19.03.2020
comment
Здравейте, благодаря за реакцията ви. Всички подробности, които дадох за връзката, трябва да са добри. Правил съм връзка с базата данни преди, но тогава не отделих конфигурацията на базата данни. Единствената разлика сега е, че всички детайли се предоставят под формата на масив и от конфигурационен файл. - person Kjvhout; 19.03.2020
comment
вярно Все пак предлагам да отстраните неизправностите назад от точката на повреда. Искам да кажа, че вашата улика е лошо име на хост на сървъра. - person O. Jones; 19.03.2020
comment
Съжалявам, бяхте напълно прав. Проверих какво съм променил, откакто работи, и открих, че някъде по пътя променям името на хоста. Благодаря ти много!! - person Kjvhout; 19.03.2020