Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP y MySql guardando y recuperando objetos

Estas en el tema de PHP y MySql guardando y recuperando objetos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola. Tengo a medias una web y despues de hacer un cursillo de Java me entra el gusanillo de utilizar objetos para todo. Ahora utilizo ...
  #1 (permalink)  
Antiguo 03/12/2007, 09:40
 
Fecha de Ingreso: abril-2006
Ubicación: El Masnou
Mensajes: 26
Antigüedad: 18 años
Puntos: 0
PHP y MySql guardando y recuperando objetos

Hola.
Tengo a medias una web y despues de hacer un cursillo de Java me entra el gusanillo de utilizar objetos para todo.

Ahora utilizo unas rutinas para la base de datos que me devuelven una consulta en un array, y yo ya voy pillando los datos del array.
Pero... si lo que quiero ahora es que me devuelva un array con objetos (Si el select es de usuarios, me devuelva un array con los objectos usuario correspondientes a la consulta), las rutinas que tengo ahora.. tendria que poner un if la consulta es FROM usuarios, ir recogiendo los datos, crear un objeto usuario con esos datos y meterlos en un array y devolverlo?

O sigo con la misma rutina, y cuando recibo el array con los datos, (no desde las rutinas bbdd) hago lo mismo, me releeo todo el array y voy creando un segundo array con los objetos usuario.

Lo veo un poco "liadillo". Por que a parte de usuarios hay foros, .... y muchas mas cosas que podrian ser objetos.

En fin, a ver quien puede darme una orientación para que no la cague desde principio.

Gracias!
  #2 (permalink)  
Antiguo 03/12/2007, 10:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: PHP y MySql guardando y recuperando objetos

Hola masnovita,

La idea es tener una clase que se encargue de la recuperación de esos datos, esta clase se le conoce como el "modelo" de tu tabla, y hay un modelo por cada tabla de tu base de datos o de tu fuente de datos.

Para que entiendas un poco mas de lo que te digo, te recomiendo veas el patrón ActiveTable y ActiveRecord, te explican muy bien como implementar un modelo de datos y recuperando objetos de la base de datos.

Saludos.
  #3 (permalink)  
Antiguo 03/12/2007, 13:46
 
Fecha de Ingreso: noviembre-2007
Mensajes: 38
Antigüedad: 16 años, 5 meses
Puntos: 2
Re: PHP y MySql guardando y recuperando objetos

Hola masnovita, te voy a contar lo que yo hago, no puedo afirmar que este bien o mal ya que soy tan nuevo como vos en esto. Y justamente me paso lo mismo que a vos, java me contagio el bichito de los objectos.

Nro1, usaria un modelo para setear la configuracion, direccion de la base, pass de la base, tabla, y cualquier otra cosa que queramos;

Código PHP:
class DBConfig {

    private 
$dbHost;
    private 
$dbUser;
    private 
$dbPassword;
    private 
$dbName;
    
    public function 
__construct($dbHost,$dbUser,$dbPassword,$dbName) {
        
$this->dbHost=$dbHost;
        
$this->dbUser=$dbUser;
        
$this->dbPassword=$dbPassword;
        
$this->dbName=$dbName;
    }
    
    public function 
getDbHost() {
        return 
$this->dbHost;
    }
    public function 
getDbUser() {
        return 
$this->dbUser;
    }
    public function 
getDbPassword() {
        return 
$this->dbPassword;
    }
    public function 
getDbName() {
        return 
$this->dbName;
    }
    

Bien, ahora vamos a crear la clase Database, esta se encarga de crear un objecto DBConfig cuando se crea y asignarselo, luego cuando le pidas una query vera si esta conectada o no, si no esta conectada se conecta y te devuelve la query.

Código PHP:
class Database {

    private 
$dbConfig;
    private 
$link;
    
    public function 
__construct($dbHost,$dbUser,$dbPassword,$dbName) {
        
        
$this->dbConfig=new DBConfig($dbHost,$dbUser,$dbPassword,$dbName);
    }
    
    private function 
connect(){

        
// if there is no link to DB then connect
        
if (!isset($this->link)){
            
            
$this->link=mysql_connect($this->dbConfig->getDbHost(),$this->dbConfig->getDbUser(),$this->dbConfig->getDbPassword());
            
mysql_select_db($this->dbConfig->getDbName(),$this->link);

            if (!isset(
$this->link))
                throw new 
Exception('Not connected',1);
        }
        
    }
    
    public function 
tquery($sql)
    {
        
$this->connect();
        
        if(!
$result mysql_query($sql,$this->link))
            throw new 
Exception('SQL ERROR',2);
        return(
$result);
    }
    
    public function 
tunquery($sql)
    {
        
$this->connect();
        
        if(!
$result mysql_unbuffered_query($sql,$this->link))
            throw new 
Exception('SQL ERROR',2);
        return(
$result);
    }
    
    public function 
escape($value)
    {
        
$this->connect();
        
        if(
get_magic_quotes_gpc()) $value stripslashes($value);
        if(!
is_numeric($value)) $value mysql_real_escape_string($value,$this->link);
        return(
$value);
    }


Lo que faltaria es que crees la clase usuario que haga algo como;

Código PHP:
class Usuario {
   private 
$id;
   private 
$login;
   private 
$pass;

   public function 
getLogin() { return $this->login; }
   public function 
getPass() { return $this->pass; }

   public 
__construct($id) {
       try {
           
$this->loadFromCache($id);
       } catch (
Exception $e) {
           
$this->loadFromDatabase($id);
       }
    }

    private function 
loadFromDatabase($id) {
        
// database debe ser creada primero
        
global $laDatabase;

        if(!
is_object($laDatabase)) throw new Exception ('no se creo objeto database');

        if (
$id<0) throw new Exception('error en id');

//        $laDatabase->tunquery("select usando el ".$id);
//        fetch assoc
//       setear usuario
//         $this . salvar en cache
    
}

    private function 
loadFromCache($id) {
       
//buscar en cache
       // si no esta tirar excepcion 
      // si esta setear usuario

   
}

Bueno, ahora lo que tenes que hacer es un php que se encargue de cargar los modelos y inicializar la base de datos;

include 'modelos.php';
$laDatabase= new Database('elHostdeDB','nombre de usuario','pass','nombre de la base');

Buenos, espero que esto ayude.

Saludos, Eugenio
  #4 (permalink)  
Antiguo 03/12/2007, 14:11
 
Fecha de Ingreso: abril-2006
Ubicación: El Masnou
Mensajes: 26
Antigüedad: 18 años
Puntos: 0
Re: PHP y MySql guardando y recuperando objetos

Pues muchas gracias a los dos. Me pongo manos a la obra, que me queda mucho por hacer. Ya os contare si he llegado a buen puerto! ;)
  #5 (permalink)  
Antiguo 03/12/2007, 16:41
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: PHP y MySql guardando y recuperando objetos

Código PHP:
 global $laDatabase


Ufff. eso es romper una de los principios más fundamentales de OOP llamado Principio de ocultación

Código PHP:
is_object($laDatabase
No será mejor definir una interfaz o clase abstracta que dé un contrato de implementación a las que hereden o implementen. principio de Abstracción

Ej:
Código PHP:
($laDatabase instanceof Database_Abstract
o
Código PHP:
($laDatabase instanceof Database_Interface
saludos.

Última edición por zsamer; 03/12/2007 a las 16:48
  #6 (permalink)  
Antiguo 03/12/2007, 17:01
 
Fecha de Ingreso: noviembre-2007
Mensajes: 38
Antigüedad: 16 años, 5 meses
Puntos: 2
Re: PHP y MySql guardando y recuperando objetos

Entiendo lo que decis... tal vez usar un patron singleton funcionaria tb, pero habria que cambiar el __construct del database.

Que solucion propones que no use global?

Despues de todo, $laDatabase es un objeto comun a todos las clases de control y de modelo.


Saludos, Eugenio

Última edición por eugenioclrc; 03/12/2007 a las 17:07
  #7 (permalink)  
Antiguo 03/12/2007, 17:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: PHP y MySql guardando y recuperando objetos

Si es común y solo manejas una instancia, debes de usar Singleton.

Saludos.
  #8 (permalink)  
Antiguo 03/12/2007, 19:43
 
Fecha de Ingreso: noviembre-2007
Mensajes: 38
Antigüedad: 16 años, 5 meses
Puntos: 2
Re: PHP y MySql guardando y recuperando objetos

Hola masnovita, me tome el trabajo de acomodar la parte de la base de datos, no arregle la clase usuario, te pego el codigo, y te advierto que no llegue a probarlo.

Por favor, indiquenme cualquier error teorico o de programacion que haya cometido. Por favo si hacen una correcion teorica justifiquenla, asi aprendo un poco jeje.

Código PHP:
<?php

abstract class Singleton {
    
//suena a reggaetton no?
    
private $yoMismo;
    
    public function 
__construct(){
        
// si no existo me creo
        
if (!isset($this->yoMismo))
            
$this->yoMismo=new $this;

        return 
$this->yoMismo;
    }
}

class 
DBConfig extends Singleton {

    private 
$dbHost;
    private 
$dbUser;
    private 
$dbPassword;
    private 
$dbName;
        
    public function 
__construct($dbHost=null,$dbUser=null,$dbPassword=null,$dbName=null) {
    
        
$this->dbHost=$dbHost;
           
$this->dbUser=$dbUser;
           
$this->dbPassword=$dbPassword;
           
$this->dbName=$dbName;
        
        
parent::__construct();    
    }
    
    public function 
getDbHost() {
        return 
$this->dbHost;
    }
    public function 
getDbUser() {
        return 
$this->dbUser;
    }
    public function 
getDbPassword() {
        return 
$this->dbPassword;
    }
    public function 
getDbName() {
        return 
$this->dbName;
    }
}

class 
Database extends Singleton {

    private 
$dbConfig;
    private 
$link;
    
    public function 
__construct($dbHost,$dbUser,$dbPassword,$dbName) {

        if (isset(
$this->dbHost)&&isset($this->dbUser)&&isset($this->dbPassword)&&isset($this->dbName))         
            
$this->dbConfig=new DBConfig($dbHost,$dbUser,$dbPassword,$dbName);
        
        return 
parent::__construct();
    }
    
    private function 
connect() {

        
// if there is no link to DB then connect
        
if (!isset($this->link)){
            
$this->link=mysql_connect($this->dbConfig->getDbHost(),$this->dbConfig->getDbUser(),$this->dbConfig->getDbPassword());
            
mysql_select_db($this->dbConfig->getDbName(),$this->link);

            if (!isset(
$this->link))
                throw new 
Exception('Not connected',1);
        }
        
    }
    
    public function 
tquery($sql) {
        
$this->connect();
        
        if(!
$result mysql_query($sql,$this->link))
            throw new 
Exception('SQL ERROR',2);
        return(
$result);
    }
    
    public function 
tunquery($sql) {
        
$this->connect();
        
        if(!
$result mysql_unbuffered_query($sql,$this->link))
            throw new 
Exception('SQL ERROR',2);
        return(
$result);
    }
    
    public function 
escape($value) {
        
$this->connect();
        
        if(
get_magic_quotes_gpc()) $value stripslashes($value);
        if(!
is_numeric($value)) $value mysql_real_escape_string($value,$this->link);
        return(
$value);
    }
}
Ahora solo debes iniciar una vez el objeto $database, y luego cada vez que quieras usarlo en una clase debes poner;
$elNombreQueQuieras = new Database;

Recuerda que la primera vez que lo crees debes poner;
$cualquierCosa=new Database('elHostdeDB','nombre de usuario','pass','nombre de la base');

Te recomendaria hacerlo en el mismo archivo que guardes la clase database, asi con incluirlo te aseguras de setearlo, o podrias hacer un archivo de init para que quede mas prolijo.



Saludos, Eugenio
  #9 (permalink)  
Antiguo 03/12/2007, 22:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: PHP y MySql guardando y recuperando objetos

Tienes mal aplicado el concepto de Singleton, para que sea estatico debes de almacenarlo en una variable estatica de la clase:
Código PHP:
class Singleton {
       private static 
$_instance null;

       private function 
__construct() {
              
       }

       public static function 
getInstance() {
              if( !( 
self::$_instance instanceof self ) {
                      
self::$_instance = new self();
              }

              return 
self::$_instance;
       }

Saludos.
  #10 (permalink)  
Antiguo 04/12/2007, 07:40
 
Fecha de Ingreso: noviembre-2007
Mensajes: 38
Antigüedad: 16 años, 5 meses
Puntos: 2
Re: PHP y MySql guardando y recuperando objetos

Hola, que significa static? se puede implementar esta clase en el codigo que escribi?

Saludos, Eugenio
  #11 (permalink)  
Antiguo 04/12/2007, 08:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: PHP y MySql guardando y recuperando objetos

Static es precisamente eso, una variable estatica de la clase y que se comparte entre todas las instancias de la clase, es decir por mas clases que tu instancies si tienes un valor estatico, este es compartido en todas las instancias de esa clase.

Saludos.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 17:24.