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"