Foros del Web » Programando para Internet » PHP »

problema clase abstract PDO no conecta

Estas en el tema de problema clase abstract PDO no conecta en el foro de PHP en Foros del Web. Hola amigos estoy tratando de implementar la clase abstract PDO, pero al ejecutar este programa simplemente no hace nada se queda en blanco pese a ...
  #1 (permalink)  
Antiguo 12/02/2014, 09:32
 
Fecha de Ingreso: febrero-2011
Mensajes: 43
Antigüedad: 13 años, 2 meses
Puntos: 0
problema clase abstract PDO no conecta

Hola amigos estoy tratando de implementar la clase abstract PDO, pero al ejecutar este programa simplemente no hace nada se queda en blanco pese a indicar de forma correcta o incorrecta las credenciales para acceder a la base de datos. creo que la parte en rojo esta mal formada, pueden ayudarme a corregir este error.

<?php

/*
* clase PDO Dbconexion.
*/

abstract class dbConexion {

protected $manejador = 'mysql';
private static $servidor = 'localhost';
protected $db_name = 'biblioteca';
private static $usuario = 'admin';
private static $pass = 'pepito';

protected $cnx;

//metodo para conectarnos a la base de datos segun los parametros establecidos
//getConexion
protected function getConexion() {
try {
$this->cnx = new PDO($this->manejador.":host=". self::$servidor.";dbname=".$this->db_name,self::$usuario, self::$pass, array(PDO::ATTR_PERSISTENT => true));
return $this->cnx;

} catch (PDOException $e) {
echo "Conexión Error:" . $e->getMessage();
}
}

}
?>
  #2 (permalink)  
Antiguo 12/02/2014, 10:14
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: problema clase abstract PDO no conecta

Hola, no veo por que defines la clase como abstract; se deben definir así sólo si tienes metodos abstractos y no veo ninguno.

te dejo un singleton para conecciones con pdo.
Espero te sirva saludos.

Código PHP:
Ver original
  1. class DbConn {
  2.  
  3.     private static $engine = 'mysql';
  4.     private static $host = 'localhost';
  5.     private static $usuario = 'xxxxxxxx';
  6.     private static $password = 'xxxxxxxxxx';
  7.     private static $base = 'xxxxxxxxxxx';
  8.     private static $CONFIG = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' );
  9.     private static $instance;
  10.  
  11.     /**
  12.      *
  13.      */
  14.     private function __construct() {
  15.     }
  16.  
  17.     private function __clone() {
  18.     }
  19.  
  20.     /**
  21.      * @return string
  22.      */
  23.     public function __toString() {
  24.         return 'Conección a Bd';
  25.     }
  26.  
  27.     /**
  28.      * @return PDO
  29.      */
  30.     public static function getInstance() {
  31.         if (!isset(self::$instance)) {
  32.             $conn = self::$engine
  33.                 . ':dbname=' . self::$base
  34.                 . ';host=' . self::$host;
  35.             try {
  36.                 $PDO            = new PDO($conn , self::$usuario , self::$password , self::$CONFIG);
  37.                 self::$instance = $PDO;
  38.             } catch (PDOException $e) {
  39.                 exit('Falló la conexión: ' . $e->getMessage());
  40.             }
  41.         }
  42.         return self::$instance;
  43.     }
  44. }
  45.  
  46. //USO
  47.  
  48. $PDO=DbConn::getInstance();
  #3 (permalink)  
Antiguo 12/02/2014, 18:43
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema clase abstract PDO no conecta

Código PHP:
Ver original
  1. class Database extends PDO {
  2.  
  3.     function __construct($driver, $host, $name, $user, $pass = null, array $opt = []) {
  4.         parent::__construct("$driver:host=$host;dbname=$name;", $user, $pass, $opt);
  5.     }
  6.  
  7. }
  8.  
  9. $link = new Database('mysql', 'localhost', 'base_de_datos', 'root');
  #4 (permalink)  
Antiguo 13/02/2014, 09:53
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: problema clase abstract PDO no conecta

Cita:
Iniciado por vmoran2009 Ver Mensaje
Hola amigos estoy tratando de implementar la clase abstract PDO, pero al ejecutar este programa simplemente no hace nada se queda en blanco pese a indicar de forma correcta o incorrecta las credenciales para acceder a la base de datos. creo que la parte en rojo esta mal formada, pueden ayudarme a corregir este error.

<?php

/*
* clase PDO Dbconexion.
*/

abstract class dbConexion {

protected $manejador = 'mysql';
private static $servidor = 'localhost';
protected $db_name = 'biblioteca';
private static $usuario = 'admin';
private static $pass = 'pepito';

protected $cnx;

//metodo para conectarnos a la base de datos segun los parametros establecidos
//getConexion
protected function getConexion() {
try {
$this->cnx = new PDO($this->manejador.":host=". self::$servidor.";dbname=".$this->db_name,self::$usuario, self::$pass, array(PDO::ATTR_PERSISTENT => true));
return $this->cnx;

} catch (PDOException $e) {
echo "Conexión Error:" . $e->getMessage();
}
}

}
?>
Supongo que estas queriendo reutilizar la conexión a la base de datos implementando la clase abstracta. Si es así, lo único que vas a lograr es incrementar el acoplamiento de tus clases que dependan de acceder a la base de datos. La solución para reducir el acoplamiento en las asociaciones de dependencia es el uso de algo que se conoce como inyección de dependencias que no es otra cosa que instanciar una clase con sus dependencias y luego pasarlas a esta ultima.
Te dejo un articulo que explica de forma general los tipo de dependencia y los aclara con ejemplos, ademas de una introducción de pimple un contenedor de dependencias (DIC) : http://www.sitepoint.com/dependency-...n-with-pimple/.

Ahora que si todo lo que supongo no es cierto, espero que nos comentes que es lo que realmente quieres hacer.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 13/02/2014, 16:32
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema clase abstract PDO no conecta

La dependencia en los buenos diseños se da en niveles más altos de abstracción, no en una clase que trabaja a bajo nivel como una conexión a la base de datos, estarías reescribiendo PDO intentando algo así, osea, reinventando la rueda.
Lo que deben hacer tus objetos es depender de la base de datos y para eso debes inyectar esa dependencia en el constructor de esos objetos dependientes.

te pongo un ejemplo rápido:
Código PHP:
Ver original
  1. <?php
  2.  
  3. abstract class BaseDeDatos {
  4.  
  5.     private $db;
  6.  
  7.     function __construct(PDO $db) {
  8.         $this->db = $db;
  9.     }
  10.  
  11.     protected function execute($statement, array $args = []) {
  12.         $stmt = $this->db->prepare($statement);
  13.         $stmt->execute($args);
  14.         return $stmt->fetchAll(PDO::FETCH_ASSOC);
  15.     }
  16.  
  17. }
  18.  
  19. interface Persona {
  20.  
  21.     function getNombre();
  22.  
  23.     function getApellido();
  24.  
  25. }
  26.  
  27. class Usuario extends BaseDeDatos implements Persona {
  28.  
  29.     function getNombre() {
  30.         return $this->execute('SELECT nombre FROM tabla_usuarios WHERE id = 1;')[0]['nombre'];
  31.     }
  32.  
  33.     function getApellido() {
  34.         return $this->execute('SELECT apellido FROM tabla_usuarios WHERE id = 1;')[0]['apellido'];
  35.     }
  36.  
  37. }
  38.  
  39. interface PlantillaPersona {
  40.  
  41.     function dibujar(Persona $persona);
  42.  
  43. }
  44.  
  45. class PersonaEnTabla implements PlantillaPersona {
  46.  
  47.     function dibujar(Persona $persona) {
  48.         return
  49.             "<table><tr><th>Nombre</th><th>Apellido</th></tr>" .
  50.             "<tr><td>{$persona->getNombre()}</td><td>{$persona->getApellido()}</td></tr></table>";
  51.     }
  52.  
  53. }
  54.  
  55. class PersonaEnDiv implements PlantillaPersona {
  56.  
  57.     function dibujar(Persona $persona) {
  58.         return
  59.             "<div><label>Nombre</label><span>{$persona->getNombre()}</span>" .
  60.             "<label>Apellido</label><span>{$persona->getApellido()}</span></div>";
  61.     }
  62.  
  63. }
  64.  
  65.  
  66. // para acabar haciendo algo así (todo lo que no deberías hacer dentro de las clases):
  67. $db = new PDO('dsn', 'user', 'pass');
  68.  
  69. $usuario = new Usuario($db);
  70.  
  71. echo "Persona dibujada en una tabla:";
  72. echo (new PersonaEnTabla)->dibujar($usuario);
  73.  
  74. echo "Persona dibujada en una capa div:";
  75. echo (new PersonaEnDiv)->dibujar($usuario);

Como ves la inyección de dependencia se da en la lógica de negocio (no en la conexión a la base de datos, que para eso ya esta PDO), en el nivel más alto de abstracción de tu aplicación.

Última edición por lolainas; 13/02/2014 a las 16:37
  #6 (permalink)  
Antiguo 13/02/2014, 16:44
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema clase abstract PDO no conecta

Amigo, algo que quiero agregar, te sugiero te olvides de implementar en algún sitio de tu aplicación el anti-patrón Singleton, duele la vista ver cosas tan aberrantes.
Si en algún momento tu problema se resuelve de esa forma es que tu diseño esta mal orientado, por que si no sabes tú cuantas instancias de un objeto estas utilizando, ten la seguridad de que tu código esta lleno de fugas, que has perdido el control de lo que estás escribiendo.

En el ejemplo de dependencias que te muestro, verás que con crear una vez la conexión a la bd, utilizarás esta para proveérsela a todos los dependientes, es más podrías crearla en el index una sola vez y de ahí pasársela a tu aplicación, y la aplicacion saber que si no recibe una base de datos, nunca necesitará utilizarla.

Saludos.

Etiquetas: abstract, clase, conecta, mysql, pdo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:36.