Estoy intnetnado conectar un desarrollo con php usando singleton, y no he sabido como hacerlo.
El primer php tiene esta info:
Código PHP:
<?php
class CBaseDatos //Tipo Singleton
{
//almacena un objeto resourse que tiene un identificador de
//conexion "linkid" o 0 en caso de error
private $_oLinkId;
private $_sServidor;
private $_sNombreBD;
private $_sUsuario;
private $_sClave;
private $_sMensaje;
private static $_oSelf = null;
private function __construct()
{
/*
En el post anterior utilizo constantes, pero si lo deseas
puedes escribir directamente los valores o incluso pasar
estos valores en el constructor. Es un poco segun tus necesidades.
Si se pasa los valores en constructor daria versatilidad
en conexiones con bd distintas en un mismo proyecto.
En alguna ocasion para migraciones lo he implementado por parametros.
__construct($sServidor,$sNombreBD..);
*/
$this->_sServidor = "localhost";
$this->_sNombreBD = "test";
$this->_sUsuario = "root";
$this->_sClave = "";
$this->_sMensaje = "";
}
/**
* Este es el pseudo constructor singleton
* Comprueba si la variable privada $_oSelf tienen un objeto
* de esta misma clase, sino lo tiene lo crea y lo guarda
*/
public static function get_instancia()
{
//Si no hay instancia de CBaseDatos
//en la variable estatica $_oSelf
if( !self::$_oSelf instanceof self )
{
//Se crea un objeto de CBaseDatos guardandolo
//en la varialbe estatica
//new self ejecuta __construct()
self::$_oSelf = new self;
}
//Se devuelve el objeto creado
return self::$_oSelf;
}
/**
* Crea un oRecurso de conexion y lo asigna a oLinkId.
* Si oLinkId es 0. Es porque el recurso no existe
* Realiza la conexion y devuelve el resultado
* @return true si hubo exito en la conexion
*/
public function conectar()
{
//Si no existe un recurso previo se intenta crear uno nuevo
if($this->_oLinkId==0)
{
//VERIFICAMOS LA CONEXION AL MOTOR DE BD
//oMysqlConnect es tipo resource si tiene exito y guarda un "link identifier"
//algo como 5893, vamos un entero.
//sino guarda un false (0)
$oMysqlConnect = mysql_connect
(
$this->_sServidor,
$this->_sUsuario,
$this->_sClave
);
//si no es tipo resource es q no ha tenido exito la conexion;
if(!is_resource($oMysqlConnect))
{
$this->_sMensaje = "ERROR: No se puede conectar a la base de datos..! ".$this->_sNombreBD;
//Lanza la excepcion y se sale del procedimiento
throw new Exception($this->_sMensaje);
die;
}
//Guardamos el id del recurso conectado, esta propiedad nos servirá
//cuando queramos ejecutar una SQL contra la BD deberemos utilizar
//la propiedad get_link_id(). Lo veremos más abajo en este post
$this->_oLinkId = $oMysqlConnect;
//VERIFICAMOS QUE EXISTA LA BASE DE DATOS EN EL MOTOR
$bExisteBD = mysql_select_db($this->_sNombreBD, $oMysqlConnect);
//si no se pudo encontrar esa BD lanza un error
if(!$bExisteBD)
{
$this->_sMensaje = "ERROR: No se puede usar la base de datos..! ".$this->_sNombreBD;
//Lanza la excepcion y se sale del procedimiento
throw new Exception($this->_sMensaje);
die;
}
else //Si se conecto
{
$this->_sMensaje = "SE CONECTO CON EXITO";
mysql_set_charset('utf8',$this->_oLinkId);
}
}//fin Ya existe recurso abierto por lo tanto se puede instanciar con get_link_id()
return true;
}
private function get_servidor()
{
return $this->_sServidor;
}
public function get_usuario()
{
return $this->_sUsuario;
}
private function get_clave()
{
return $this->_sClave;
}
public function get_mensaje()
{
return $this->_sMensaje;
}
public function get_nombre_bd()
{
return $this->_sNombreBD;
}
/**
* Devuelve un entero mayor a 0 si hay conexión.
* En caso contrario 0
*/
public function get_link_id()
{
return $this->_oLinkId;
}
}
?>
El segundo php tiene esta info
Código PHP:
<?php
include_once('cBaseDatos.php');
class Sqls
{
//Una instancia de
private $_oBaseDatos;
private $_sTabla;
public function __construct($id=0, $sNombre="", $sEmail="", $sClave="")
{
//Abrimos un flujo de conexion con nuestro componente
$this->_oBaseDatos = CBaseDatos::get_instancia();
$this->_oBaseDatos->conectar();
}
/**
* Sobre los 3 metodos: query(), query_object() y execute()
* Lo ideal seria crear una clase madre con los atributos:
* oBaseDatos, id, sTabla y estos metodos de modo que todos los
* modelos hereden (extiendan) estas propiedades.
* La definicion de esta clase seria: class MUsuario extends ModeloMadre{..}.
* No lo he puesto
* aqui porque el post seria demasiado extenso.
*/
/**
* Se utiliza para SQLs tipo SELECT, es decir, de lectura y
* devuelve un array con el resultado
*/
private function query($sSQL)
{
$arTabla = array();
try
{
/**
* resource = mysql_query ( string $query [, resource $link_identifier ] )
* Aqui entra en juego nuestro Componente tipo singleton CBaseDatos
*/
$oResult = mysql_query($sSQL, $this->_oBaseDatos->get_link_id());
/**
* array = mysql_fetch_array ( resource $result [, int $result_type = MYSQL_BOTH ] )
*/
while($arFila = mysql_fetch_array($oResult, MYSQL_ASSOC))
{
$arTabla[$this->_sTabla][] = $arFila;
}
//Array que tiene como indices los nombres de los campos
//$arTabla['tbl_usuario'][iNumeroFila] = array('id'=>'valor','nombre'=>'valor'...);
return $arTabla;
}
catch (Exception $e)
{
die("Metodo query: Error al ejecutar la sentencia SQL = $sSQL");
}
}
/**
* Se utiliza para SQLs tipo SELECT, es decir, de lectura y
* devuelve un array con el resultado parecido al anterior
* pero este crea un array de pseudo objetos. de modo que puedas
* recuperar un item del array en forma de $arUsuario[$i]->nombre su equivalente
* en el metodo anterior seria $arUsuario[$i]['nombre'].
*/
private function query_object($sSQL)
{
$arTabla = array();
$oResult = mysql_query($sSQL, $this->_oBaseDatos->get_link_id());
if($oResult)
{
while($arFila = mysql_fetch_object($oResult))
{
$arTabla[] = $arFila;
}
}
else
{
die("Metodo query_object: Error al ejecutar la sentencia SQL = $sSQL");
}
//$arTabla[$i]->id, $arTabla[$i]->nombre, $arTabla[$i]->clave ...
return $arTabla;
}
/**
* Este metodo ejecuta una SQL de escritura.
* estas son INSERT, UPDATE y DELETE
*/
private function execute($sSQL)
{
try
{
//$this->oTfw->set_sql($sSQL);
$oResult = mysql_query($sSQL);
//@mysql_query("SET NAMES utf8");
if (!$oResult)
{
$sMensaje = "Sentencia SQL con errores: " . mysql_error() . "\n";
$sMensaje .= "SQL =" . $sSQL;
die($sMensaje);
}
}
catch(Exception $e)
{
}
}
}
?>
Código PHP:
<?php
include_once('../db/sql.php');
$sql=new Sqls();
$datos = Sqls->query('select * from usuario');
?>