pdo:: construct (): php network getaddresses: getaddrinfo failed: name or service not known in


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

define('URL', 'https://www.aynii.pe/');
define('APLICATION', 'aplication/');
define('DB_TYPE', 'mysql');
define('DB_HOST', 'aynii.pe');
define('DB_USER', '');
define('DB_PASSWORD', '');
define('DB_NAME', 'aynii_db');
define('DB_CHARSET', 'utf8');
define('HASH_PASSWORD_KEY', '@nexus and artic fox Systems and Information Engineer@');
define('DEFAULT_CONTROLLER', 'login');

и я получаю его в классе DataBase

public function __construct($DB_TYPE,$DB_HOST,$DB_NAME,$DB_USER,$DB_PASS,$OPCIONES)
{
    parent:: __construct($DB_TYPE.':host='.$DB_HOST.';dbname='.$DB_NAME,$DB_USER,$DB_PASS,$OPCIONES);
    parent:: setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

я не могу найти ошибку, так как бывают случаи, когда я получаю ошибку, а другие, когда он вводит нормальный

Author: alanfcm, 2018-08-17

1 answers

Я не знаю, почему ваш класс имеет конструктор, который вызывает другой конструктор.

Если вы хотите реализовать утилитарный класс для обработки ваших соединений, вы можете просто расширить его из PDO и использовать конструктор PDO для создания экземпляра соединения.

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

Давайте посмотрим на пример, где учетные данные подключения существуют как члены класса.

Я бы предложил класс, похожий на этот:

<?php

class DataBase extends PDO
{
    private $pdo;
    private $dbtype="mysql";
    private $host="localhost";  //El host suele ser este, no el nombre de dominio
    private $dbname="aynii_db";
    private $dbcharset="utf8";
    private $usr="";
    private $pwd="";

    public function __construct()
    {
        $this->Connect();

    }

    private function Connect()
    {
        $host=$this->host;
        $dsn = $this->dbtype.":host=".$this->host.";dbname=".$this->dbname.";charset=".$this->dbcharset;
        $arrOptions = array(
            PDO::ATTR_EMULATE_PREPARES => FALSE,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );

        try 
        {
            $this->pdo = new PDO($dsn, $this->usr, $this->pwd, $arrOptions);
        }
        catch (PDOException $e) 
        {
            error_log($this->error = $e->getMessage(),0);
        }
    }
}

?>

Здесь мы передаем все параметры в конструкторе с помощью $arrOptions, таким образом, мы избегаем дальнейшей обработки объекта после его создания. Кроме того, мы включаем опцию ATTR_EMULATE_PREPARES в FALSE, чтобы предотвратить эмулированные препараты, которые могут быть использованы злыми намерениями пользователей, чтобы попытаться эмулировать подготовленные запросы и вводить вредоносный код.

Способ использования

Класс будет использоваться так просто:

$db=new Database();

И у вас уже будет $db экземпляр соединения, без необходимости обрабатывать учетные данные.

 1
Author: A. Cedano, 2020-06-11 10:54:57