Ver Mensaje Individual
  #4 (permalink)  
Antiguo 12/10/2011, 08:40
Avatar de Webstudio
Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 6 meses
Puntos: 69
Respuesta: Clase modelo.(MVC) Conexión a base de datos.

IMAC, como estás...
Si vos hacés que CADA clase que trabaja con base de datos, tenga los datos de conexión, te vas a volver loco a la hora de cambiarlos de lugar. Yo te recomiendo hacer algo asi:

Código PHP:
<?php
class DB
{
    protected 
$_config = array();
    protected 
$_conn null;
    protected 
$_stmt null;

    public function 
__construct($config)
    {
        
$this->_config $config;
    }

    public function 
connect()
    {
        
$this->_conn = new PDO(
            
$this->getConnString(),
            
$this->_config['user'],
            
$this->_config['password']);
    }

    public function 
isConnected()
    {
        return 
$this->_conn != null;
    }

    public function 
getConn()
    {
        return 
$this->_conn;
    }

    public function 
query($query)
    {
        
$this->_stmt $this->_conn->query($query);
    }
    
    
/** etc, etc, etc, acá implementás los métodos que te sean útiles 
        O directamente podés utilizar los objetos que te ofrece PDO */
}

class 
MySQLDB extends DB
{
    public function 
getConnString()
    {
        return 
'mysql:'
              
.'host='.$this->_config['host'].';'
              
.'dbname='.$this->_config['dbname'];
    }
}

class 
SQLiteDB extends DB
{
    public function 
getConnString()
    {
        return 
'sqlite:'.$this->_config['file'];
    }
}
Con esto, ya unificaste en un par de clases todo lo que es la creación de nuevas conexiones, incluso de distintos tipos de conexiones. Ya podés reutilizar este código en otros lados :

Código PHP:
/** Conexión 1 */
$config get_configuracion(); // Esto saldrá de algún lado.
$mysql  = new MySQLDB($config);


/** Conexión 2 */
$mysql2 = new MySQLDB(array(
    
'host'      => '127.0.0.1',
    
'user'      => 'webstudio',
    
'password'  => 'nosedicenlospasswords',
    
'dbname'    => 'nilosnombresdedb',
));

/** Conexión 3 - otro motor de base de datos */
$sqlite = new SQLiteDB(array('/var/www/foros/usuarios.sqlite')); 
Entonces, si tenés distintos tipos de clases que interactúan con distintos tipos de datos en tu sistema, pasando la instancia específica, ya podés usar la base de datos sin tener que preocuparte, por qué tipo es, ni reescribiendo código.

Código PHP:
class Model
{
    protected 
$_db null;

    public function 
__construct(DB $db)
    {
        
$this->setDb($db));
    }

    public function 
setDb(DB $db)
    {
        
$this->_db $db;
    }
}

class 
Product extends Model
{
    public function 
getProducts()
    {
        
$conn $this->_db->getConn();
        return 
$conn->query('SELECT * from products');
    }
}


class 
User extends Model
{
    public function 
getById($id)
    {
        
$conn $this->_db->getConn();
        
$query $conn->prepare('SELECT blabla FROM users WHERE id = :id');

        return 
$query->execute(array(':id' => $id));
    }
}

$users = new User($sqlite);
$user $users->getById(5);

$products = new Products($mysql);
$all $products->getProducts(); 
Como te darás cuenta, al estar utilizando PDO, casi que no te importa ahora qué tipo de base de datos estás utilizando en tus objetos, simplemente funcionan porque comparten la misma API.

Saludos y espero que te sirva.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com