Foros del Web » Programando para Internet » PHP »

duda con php

Estas en el tema de duda con php en el foro de PHP en Foros del Web. hola a todos Estoy intnetnado conectar un desarrollo con php usando singleton, y no he sabido como hacerlo. El primer php tiene esta info: Código ...
  #1 (permalink)  
Antiguo 16/08/2014, 14:14
Avatar de fbirrer  
Fecha de Ingreso: enero-2006
Ubicación: Santiago de Chile
Mensajes: 329
Antigüedad: 13 años, 10 meses
Puntos: 0
duda con php

hola a todos

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($oResultMYSQL_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)
        {
 
        }        
    }
}
?>
El tercer php, no se como hacerlo, tengo que conectarme al mentodo del segundo (que está conectado con los datos del primero)

Código PHP:
<?php 
include_once('../db/sql.php');
$sql=new Sqls();
$datos Sqls->query('select * from usuario');



?>
Como lo ejecuto el tercero, como puedo obtener los datos, gracias
__________________
Desde Santiago de Chile
Grupo Universite
Información sobre los Institutos Chilenos de Educación
www.universite.cl
  #2 (permalink)  
Antiguo 16/08/2014, 14:29
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 11 años, 4 meses
Puntos: 1532
Respuesta: duda con php

singleton no será el mejor de los patrones pero es funcional, el problema es que no estas usando la POO de manera óptima, para empezar disfrazar una librería nativa dentro de una estructura POO es algo ya muy gastado, eso es un patrón wrapper, PHP ya dispone de librerias POO para acceder a los datos de forma eficiente y orientado a objetos, entre ellas PDO (para varias SDBMS) y MySQLi (para MySQL).

si quieres una conexión centralizada, crea un singleton para contener la instancia de conexión de PDO, dentro puedes escribir el wrapper a las funciones de SQL, o algo así como hacer un ORM, pero los mismos ya existen, entre ellos Docrine, ActiveRecord, entre otros.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 16/08/2014, 14:44
Avatar de fbirrer  
Fecha de Ingreso: enero-2006
Ubicación: Santiago de Chile
Mensajes: 329
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: duda con php

hola, gracias por responder, tienes algun ejemplo del cual me pueda agarrar para hacer esa coneccion

gracias
__________________
Desde Santiago de Chile
Grupo Universite
Información sobre los Institutos Chilenos de Educación
www.universite.cl
  #4 (permalink)  
Antiguo 16/08/2014, 14:50
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 11 años, 4 meses
Puntos: 1532
Respuesta: duda con php

esta todo en el manual, lo único que añadirías seria el singleton:

http://php.net/manual/es/pdo.construct.php
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Etiquetas: mysql, select, sql, tabla, variable
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 23:52.