Ver Mensaje Individual
  #13 (permalink)  
Antiguo 06/01/2009, 11:04
Avatar de enriqueplace
enriqueplace
 
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Opinion sobre clase para MySQL

Estimado Italico76:

Lamento que constantemente se repitan en el foro las mismas consultas sobre cómo crear una clase de abstracción de base de datos. Ya creo que hay muchas preguntas que se responden en el foro durante *toda nuestra vida* que podrían dar alguna pista

En primera instancia y viendo solo el código te puedo decir que:


Te muestro a grueso modo cómo quedaría:

Código PHP:
<?php

class Database
{
    private static 
$_instancia;

    private 
$_con;
    private 
$_user;
    private 
$_pass;
    private 
$_server 'localhost';
    private 
$_db;
    private 
$_sql;
    private 
$_resultado;
    private 
$_total;
    private 
$_pos 0;

    
/* Si es privado, no se usa nunca */
    
private function __construct(){}

    public static function 
getInstance()
    {
        if (!isset(
self::$_instancia)) {
            
$obj __CLASS__;
            
self::$_instancia = new $obj;
        }
        return 
self::$_instancia;
    }
    public function 
setServer($server)
    {
        
$this->_server $server;
    }
    public function 
setUser($user)
    {
        
$this->_user $user;
    }
    public function 
setPass($pass)
    {
        
$this->_pass=$pass;
    }
    public function 
conectar($db)
    {
        if (!isset(
$this->_con)){
            
            
$this->_db $db;

            
$this->_con mysql_connect(
                
$this->_server,
                
$this->_user,
                
$this->_pass) or die(mysql_error()
            );
            
mysql_select_db($db) or die(mysql_error());
        }
    }
    public function 
execute($sql)
    {
        
$this->_sql $sql;

        
$this->_resultado mysql_query($this->_sql);

        if (
strtolower($consulta[0]) == 's'){
            
$this->_total mysql_num_rows($this->_resultado);
        }else{
            
$this->_total mysql_affected_rows($this->_con);
        }        
    }
    public function 
next()
    {
        
$this->_pos++;
    }
    public function 
prev()
    {
        
$this->pos--; 
    }
    public function 
getTotal()
    {
        return 
$this->total;
    }
    public function 
getOne($campo)
    {
        return 
mysql_result($this->_resultado,$this->_pos,$campo);
    }
    private function 
__clone()
    {
        throw new 
Exception('No se permite clonar');
    }
}

$my dbx::getInstance();

$my->setUser('mi_user');
$my->setPass('mi_pass');
$my->conectar('mi_base');

$my->execute('SELECT * FROM banned');

echo 
"Total registros: ".$my->getTotal()."<br/>";
echo 
$my->getOne('ip');
echo 
$my->getOne('fecha');
En mi opinión separaría las responsabilidades en dos clases, Database maneja todas las conexiones y operaciones hacia la misma y otra clase Sql que se encargue de generar las consultas sql y validaciones, luego decides si Database debe recibir solo objetos de tipo Sql o simplemente la consulta generada.

De la misma forma, podrías generar una clase más genérica Database y abastraer los tipos de manejadores (MySQL, PostgreSQL, etc), pero todo dependerá qué quieres hacer y si te es útil.

Por lo pronto el hecho que todo tu sistema dependa de tu Database genera el efecto de "capa de abstracción", si mañana tienes que cambiar de motor solo modificas esa clase, no todo tu sistema.

"No hay problema en informática que no se resuelva con otra capa de abstracción"
__________________
Blog phpsenior.com Cursos a Distancia surforce.com

Última edición por enriqueplace; 06/01/2009 a las 11:11