Foros del Web » Programando para Internet » PHP »

Conectar a la base de datos con clases

Estas en el tema de Conectar a la base de datos con clases en el foro de PHP en Foros del Web. Hola a todos!! Gracias por tomarse el tiempo de leer mi tema, Tengo un problema y es que investigando un poco encontré que no es ...
  #1 (permalink)  
Antiguo 10/02/2014, 11:49
Avatar de mili_07  
Fecha de Ingreso: febrero-2012
Mensajes: 58
Antigüedad: 12 años, 2 meses
Puntos: 1
Pregunta Conectar a la base de datos con clases

Hola a todos!! Gracias por tomarse el tiempo de leer mi tema, Tengo un problema y es que investigando un poco encontré que no es bueno utilizar Singleton para la conexión a la base de datos, estoy haciendo un sistema de login de usuarios pero no sé como conectar la base de datos tengo la clase usuarios por un lado y por el otro tengo la clase de conexion a la base de datos, tengo esto en la clase de conexion;

Código PHP:
class ConectBD{
    
    public function 
__construct(){
        
        
$nbase 'mysql:dbname=testtransaction;host=127.0.0.1';
        
$user 'user';
        
$pass 'root';
    
        try {
            
$conex = new PDO($nbase$user$pass);
                
        }catch (
PDOException $e) {
            echo 
'Falló la conexión: ' $e->getMessage();
        }
    }
    

Y este método en la clase de usuarios;

Código PHP:
public function insertarDatosUser(){
            
                
$val1 $this->getNombre();
                
$val2 $this->getnombreUser();
                
$val3 $this->getContraseña();
                
$val4 $this->getEmail();
                
$val5 $this->getApellido();
                
                
                
//Acá tengo que hacer el script de inserción en la base de datos 
Son dos archivos diferentes uno classConexion.php y el otro classUsuarios.php.
Mi duda es como hago para llamar a la conexión en el método de la clase usuarios,
Agradezco si alguien me puede dar una mano.

Saludos!
__________________
...Si quieres que tu código funcione y tienes errores, borra todo y vuelve a empezar...
  #2 (permalink)  
Antiguo 10/02/2014, 12:00
Avatar de charlyrosero  
Fecha de Ingreso: julio-2006
Mensajes: 161
Antigüedad: 17 años, 8 meses
Puntos: 5
Respuesta: Conectar a la base de datos con clases

para empezar , deberias crear la clase donde consultas los datos extendida a la conexion. con esto todas las propiedades y metodos de la clase "ConectDB" estarian heredadas por la nueva funcion.

me explico

Cita:
class nuevacnx extends ConectBD {

public function insertarDatosUser(){

$val1 = $this->getNombre();
$val2 = $this->getnombreUser();
$val3 = $this->getContraseña();
$val4 = $this->getEmail();
$val5 = $this->getApellido();
}
}

$mysql = new nuevacnx //supondria que al heredar llama al constructor de la clase ConecDB
$mysql->insertarDatosUser(); //llama al metodo
intenta probar este código y nos cuentas !!
  #3 (permalink)  
Antiguo 10/02/2014, 16:03
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: Conectar a la base de datos con clases

Cita:
Iniciado por mili_07 Ver Mensaje
Hola a todos!! Gracias por tomarse el tiempo de leer mi tema, Tengo un problema y es que investigando un poco encontré que no es bueno utilizar Singleton para la conexión a la base de datos, estoy haciendo un sistema de login de usuarios pero no sé como conectar la base de datos tengo la clase usuarios por un lado y por el otro tengo la clase de conexion a la base de datos, tengo esto en la clase de conexion;

Código PHP:
class ConectBD{
    
    public function 
__construct(){
        
        
$nbase 'mysql:dbname=testtransaction;host=127.0.0.1';
        
$user 'user';
        
$pass 'root';
    
        try {
            
$conex = new PDO($nbase$user$pass);
                
        }catch (
PDOException $e) {
            echo 
'Falló la conexión: ' $e->getMessage();
        }
    }
    

Y este método en la clase de usuarios;

Código PHP:
public function insertarDatosUser(){
            
                
$val1 $this->getNombre();
                
$val2 $this->getnombreUser();
                
$val3 $this->getContraseña();
                
$val4 $this->getEmail();
                
$val5 $this->getApellido();
                
                
                
//Acá tengo que hacer el script de inserción en la base de datos 
Son dos archivos diferentes uno classConexion.php y el otro classUsuarios.php.
Mi duda es como hago para llamar a la conexión en el método de la clase usuarios,
Agradezco si alguien me puede dar una mano.

Saludos!
Fuera de como estas intentando persistir tu clase Usuario, tu problema por el cual consultas se resuelve mediante algo que se llama inyección de dependencias en el articulo explica de forma general que es y como puedes usarla.

Cita:
para empezar , deberias crear la clase donde consultas los datos extendida a la conexion. con esto todas las propiedades y metodos de la clase "ConectDB" estarian heredadas por la nueva funcion.
Esta aproximación no es muy recomendable por que se esta violando de entrada el principio de sustitución de Liskov. y estas agregando acoplamiento entre las clases, ademas de que la asociación entre las clases es de clara dependencia.

Inyeccion usando el constructor
Código PHP:
Ver original
  1. class Usuario{
  2.     private $db;
  3.  
  4.     private $nombre;
  5.  
  6.     //mas propiedades
  7.  
  8.     public function __construct(ConectBD $db){
  9.         $this->db = $db;
  10.     }
  11.  
  12.     public function insert(){
  13.         $this->db->beginTransaction();
  14.         $this->db->exec("insert ...."); //insert a la base de datos
  15.         $this->db->commit();
  16.     }
  17.  
  18. }
  19.  
  20. class ConectBD{
  21.  
  22.     public function __construct(){
  23.  
  24.         $nbase = 'mysql:dbname=testtransaction;host=127.0.0.1';
  25.         $user = 'user';
  26.         $pass = 'root';
  27.  
  28.         try {
  29.             $conex = new PDO($nbase, $user, $pass);
  30.             return $conex;
  31.  
  32.         }catch (PDOException $e) {
  33.             echo 'Falló la conexión: ' . $e->getMessage();
  34.         }
  35.     }
  36.  
  37. }

Uso basado eb tu ejemplo:
Código PHP:
Ver original
  1. $con = new ConectBD();
  2. $usuario = new Usuario($con); //inyeccion
  3. $usuario->insert();

Haciendo uso de un contenedor de inyecciones (pimple)
Código PHP:
Ver original
  1. $container = new Pimple();
  2.  
  3. $container['db'] = function() {
  4.     $host = 'localhost';
  5.     $dbName = 'testtransaction';
  6.     $user = 'user';
  7.     $pass = 'root';
  8.  
  9.     return new \PDO("mysql:host={$host};dbname={$dbName}", $user, $pass);
  10. };
  11.  
  12. class Usuario{
  13.     private $db;
  14.  
  15.     private $nombre;
  16.  
  17.     //mas propiedades
  18.  
  19.     public function __construct(Pimple $container){
  20.         $this->db = $container['db'];
  21.     }
  22.  
  23.     public function insert(){
  24.         $this->db->beginTransaction();
  25.         $this->db->exec("insert ...."); //insert a la base de datos
  26.         $this->db->commit();
  27.     }
  28.  
  29. }
Uso
Código PHP:
Ver original
  1. $usuario = new Usuario($container); //inyeccion
  2. $usuario->insert();
Espero te sirva. Si omití algo o tengo algún error, aprecio sus opiniones sobre el tema
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #4 (permalink)  
Antiguo 11/02/2014, 07:50
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Conectar a la base de datos con clases

Hola:

Si lo q estás haciendo es para aprender PHP, pues muy bien por tí.
Pero si estás desarrollando una aplicación 'seria' para resolver un problema, te recomiendo q utilices algún framework q se encargue de estas cosas por tí. Vas a ganar en tiempo y salud ;)
Akí los 2 más conocidos ORM de php:
http://propelorm.org/
http://www.doctrine-project.org/

Si no sabes q es un ORM:
http://es.wikipedia.org/wiki/Mapeo_objeto-relacional
Básicamente en un mecanismo para meter tus objetos dentro de una base de datos sin dolor.

slds;

nup_

Etiquetas: pdo, phpoo
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 16:57.