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);
}
я не могу найти ошибку, так как бывают случаи, когда я получаю ошибку, а другие, когда он вводит нормальный
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
экземпляр соединения, без необходимости обрабатывать учетные данные.