pdo::__construct(): php_network_getaddresses: getaddrinfo failed: name or service not known in – php mysql pdo

Pregunta:


estoy subiendo mi sitio web al servidor y al momento de loguearme me vota este error.
tengo una pagina conexion en el cual detallo toda la configuracion

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 [email protected]');
define('DEFAULT_CONTROLLER', 'login');

y la recibo en la clase 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);
}

no logro encontrar el error ya que hay momentos en que me sale el error y otros en que ingresa normal

Preguntado por: Fernando Abel Gonzales Ch

A. Cedano

No sé a qué se debe que tu clase tenga un constructor que invoca a otro constructor.

Si quieres implementar una clase utilitaria para manejar tus conexiones, simplemente puedes hacerla que extienda de PDO y usar el constructor de PDO para crear la instancia de la conexión.

Por seguridad, las credenciales de conexión no deberían existir definidas en constantes no importa donde. Conviene que sean miembros privados de la clase, o, para más seguridad, guardarlas en un archivo de configuración que esté protegido e incluso aislado para otros usuarios con menos privilegios.

Veamos un ejemplo donde las credenciales de conexión existen como miembros de la clase.

Propondría una clase parecida a esta:

<?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);
        }
    }
}

?>

Aquí pasamos todas las opciones en el constructor mediante $arrOptions, de ese modo evitamos seguir manejando el objeto una vez creado. Además incluimos la opción ATTR_EMULATE_PREPARES en FALSE para impedir preparaciones emuladas que pueden ser explotadas por usuarios mal intenciones para intentar emular consultas preparadas e inyectar código malicioso.

Modo de uso

La clase se usaría así simplemente:

$db=new Database();

Y ya tendrías un $db una instancia de la conexión, sin tener que estar haciendo trasiego de credenciales.

Fuente

Tags:, ,

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *