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

Clase para DB.

Estas en el tema de Clase para DB. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Bueno, ya se que seguramente hay un monton de clases que se conectan a una DB, que tienen metodos para consultas, etc, etc, etc ...; ...
  #1 (permalink)  
Antiguo 16/03/2005, 12:54
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 9 meses
Puntos: 4
Clase para DB.

Bueno, ya se que seguramente hay un monton de clases que se conectan a una DB, que tienen metodos para consultas, etc, etc, etc ...; el punto es que yo quiero hacer con mi propio conjunto de clases que me permitan administrar mi DB.

La idea es tratar de realizar estas clases de la forma mas dicatica posible. Y en fin, la ides es irla evolucionando hasta que realmente funcione como corresponde.

Requisitos.
Necesito desarrollar las clases necesarias para que yo pueda conectarme a la base de datos, configurar sobre que tablas queiro trabajar y realizar las consultas pertinentes y que me devuleva los resultados de dicha consulta de la mejor forma posible. Uno piensa en un array (uno que no sabe, vio ...).

Preguntas

La estructura de las clases tiene que ir firmemente acompada de la estructura de las tablas de mi DB ?
Lo que mencionas de "La estructura de las clases tiene que ir firmemente acompada de la estructura de las tablas de mi DB ?" .... Una vez "diseñado" tu capa de abstracción de BD "genérica" .. ahí dependiendo del modelo de datos de tu aplicación concreta puedes ir creando tus "métodos" y objetos que llamen a datos que tu aplicación gestione .. cosas como "dame datos del cliente bajo tal críterio" en tal formato .. que se basarán en su base en una consulta SQL más o menos compleja que irá directamente relacionada con las tablas que compongan tu BD y relación de estas entre sí ..

Esta "classe" podría ser una extensión para la "padre" (la "capa").
Cluster


Pues la base de datos debería ser independiente de la aplicación (en teoría)... porque la idea es que otras aplicaciones puedan compartir la misma base de datos.
Pero las aplicaciones sí se escriben de acuerdo a la estructura de la base de datos que van a utilizar (ojo, estructura. No importa el DBMS)...
Una capa de abstracción te permite con pocos (o cero) cambios en tu aplicación poder migrar de un DBMS a otro.

Jpinedo





Disculpen mi dureza craneal o mas bien de mi masa cefalica, como todos sabemos es bastante dificil encarar POO. He leido algo sobre el tema; y creo que lo que me falta ahora es plasmar estos pequeños conocimientos.

Datos
Nombre del proyecto: Connestor
Fecha de Inicio: 16.03.2005

Aportes
Cluster
Jpinedo
Calisco


Código PHP:
/*
* Proyecto Connestor
* Fecha de Inicio: 16.03.2005
* Version Actual: 1.0

* Descripcion: Manjador de base de datos
*/ 
__________________
| Cabeza De Raton |

Última edición por Calisco; 17/03/2005 a las 08:34
  #2 (permalink)  
Antiguo 16/03/2005, 14:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 23 años
Puntos: 129
Cita:
Preguntas
La estructura de las clases tiene que ir firmemente acompada de la estructura de las tablas de mi DB ?
mm .. Pues una capa de abstracción de BD tan sólo te pone a tu disposición métodos que te permiten acceder a tu BD .. conectarte, hacer consultas .. obtener sus resultados .. etc. La estructura de tu "modelo de datos" .. cara a una "capa de abstracción" del tipo común .. no ha de ir ligada ni mucho menos al modelo de datos de tu BD (de tus tablas).

Podrías ver algunas de esas classes .. probarlas y sacar tus conclusiones. Creo que estando en un punto que "ya está inventado" el tema .. es bueno sacar lo bueno de una .. y de otra para hacer una própia que te acomode a ti y tal vez otros usuarios que tengan las mismas inquietudes de uso que tu.

Para que veas algunas:
ADOdb (http://adodb.sourceforge.net/)
ezSQL (http://justinvincent.com/home/articles.php?articleId=2)

-------------
Ahora .. eso sería la "capa de abastracción de tu BD" .. como veras en los ejemplos se trata de abarcar un grán número de "motores" (RDBMS) de BD diferentes para hacer tu aplicación versatil al punto de que puedas usar una u otra BD con el mismo (o leves cambios) código PHP.

Lo que mencionas de "La estructura de las clases tiene que ir firmemente acompada de la estructura de las tablas de mi DB ?" .... Una vez "diseñado" tu capa de abstracción de BD "genérica" .. ahí dependiendo del modelo de datos de tu aplicación concreta puedes ir creando tus "métodos" y objetos que llamen a datos que tu aplicación gestione .. cosas como "dame datos del cliente bajo tal críterio" en tal formato .. que se basarán en su base en una consulta SQL más o menos compleja que irá directamente relacionada con las tablas que compongan tu BD y relación de estas entre sí ..

Esta "classe" podría ser una extensión para la "padre" (la "capa").

No sé realmente hacia donde va tu enfoque de "clases que se conectan a una DB" .. pero en principo deberías partir por una del estilo que comento.


Un saludo,
  #3 (permalink)  
Antiguo 16/03/2005, 14:46
Avatar de marlx  
Fecha de Ingreso: febrero-2004
Ubicación: Viña del Mar - Chile
Mensajes: 55
Antigüedad: 20 años, 10 meses
Puntos: 0
De acuerdo Lo mas generico que he visto hasta hoy

Código PHP:

<?php
class CnxBd{
    
//Atributos Basicos de la clase
    
var $servidor//Nombre de la maquina donde se encuentra la BD generalmente es localhost
    
var $nombreBD//Nombre de la Base de Datos
    
var $nombreDeUsuario//Nombre del usuario autorizado para entrar a la Base de Datos
    
var $contrasena//Contraseña del Usuario

    //Atributos Modificados
    
var $enlace;//Almacena el enlace con la Base de Datos una vez establecido
    
var $resultado;//Almacena el resultado obtenido por la consulta a la BD
    
var $consulta;//Almacena la consulta realizada con el metodo consultaBD();
//----------------------------------------------------
    //Constructor de la Clase
    //Inicializa algunos atributos Básicos
    //Ejemplo: $objBD=new //AdaCnxBD("localhost","MiBaseDeDatos","MiNombreDeUsuario","MiContraseña");
    
function CnxBd($servidor,$nombreBD,$nombreDeUsuario,$contrasena){
        
$this->servidor=$servidor;
        
$this->nombreBD=$nombreBD;
        
$this->nombreDeUsuario=$nombreDeUsuario;
        
$this->contrasena=$contrasena;
    }

    
//Metodos y Procedimientos
    //conectarBD(); Te permite conectar y enlazar la BD, el enlace a la BD es almacenado modificando
    //el atributo $enlace
    //Ejemplo: $objBD->conectarBD();
    
function conectarBD(){        
        if(
$enlace=mysql_connect($this->servidor,$this->nombreDeUsuario,$this->contrasena)){
            if(
mysql_select_db($this->nombreBD,$enlace)){
                
$this->enlace=$enlace;
            }else{
                echo 
"Error al seleccionar la base de datos!";
                exit();
            }
        }else{
            echo 
"Error al enlazar al Servidor!";
            exit();
        }
    }

    
//consultarBD(); permite realizar consultas en la BD enlazada
    //Ejemplo: $objBD->consultarBD("select * from MyTabla where 1");
    
function consultarBD($sentenciaSQL){
        
$this->consulta=mysql_query($sentenciaSQL,$this->enlace);
    }

    
/*---------------------------------------------------------------
    obtenerResultado(); Devuelve los resultados de la Base de Datos
    Ejemplo:

    while($fila=$objBD->obtenerResultado()){
    printf("%s<br>",$fila["nombre"]);
    }
    ---------------------------------------------------------------*/

    
function obtenerResultado(){
        
$this->resultado=mysql_fetch_array($this->consulta);
        return 
$this->resultado;
    }

    
//obtenerCantidad() obtiene la cantidad de resultados obtenidos
    
function obtenerCantidad(){
        
$numero=mysql_num_rows($this->consulta);
        return 
$numero;
    }

    function 
insertarRegistro($sentenciaSQL){
        
mysql_query($sentenciaSQL,$this->enlace);
    }

    
//liberarConsulta(); libera el contenido del atributo que almacena las consultas
    //Ejemplo: $objBD->consultarBD("select * from MyTabla where 1");
    
function liberarConsulta(){
        
mysql_free_result($this->consulta);
    }

    
//desconecta el enlace con la base de datos
    
function desconectarBD(){
        
mysql_close($this->enlace);
    }

}
//Fin de la Clase CnxBd
?>
__________________
Dim Mario as New Ingeniero
  #4 (permalink)  
Antiguo 16/03/2005, 19:11
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 3 meses
Puntos: 41
Código PHP:
La estructura de las clases tiene que ir firmemente acompada de la estructura de las tablas de mi DB 
Pues la base de datos debería ser independiente de la aplicación (en teoría)... porque la idea es que otras aplicaciones puedan compartir la misma base de datos.
Pero las aplicaciones sí se escriben de acuerdo a la estructura de la base de datos que van a utilizar (ojo, estructura. No importa el DBMS)...
Una capa de abstracción te permite con pocos (o cero) cambios en tu aplicación poder migrar de un DBMS a otro.
Pero para utilizar una aplicación orientada a objetos con una base de datos relacional, tienes que conocer técnicas de mapeo. Existe patrones ya definidos para las diversas situaciones en las que necesitarás mapear datos de la BD en objetos (o viceversa). Del tema sé poco, pero Webstudio hace un tiempo dejó unos enlaces bastanet interesantes sobre ese tema. Pero de todos modos ... eso es lo que tienes que buscar "mapeo de objetos a tablas relacionales" (o viceversa).

Saludos
  #5 (permalink)  
Antiguo 17/03/2005, 07:21
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 9 meses
Puntos: 4
OK, muchas gracias a todos. Respecto al tema mapper he leido un poco de info, entre ellas el informe de webstudio que creo que estaba en zonephp.net.

Pregunta
Como puedo especificar a mi clase el RDBMS que voy a utilizar ?
Podria ser esta una propiedad de la clase de que en funcion del valor de la misma la clase 'sepa' el motor a utlilizar ?.
Deberia estar en el constructor de la clase ?
Que significa RDBMS ?. Por lo que estuve viendo, significa relational database management system ?
__________________
| Cabeza De Raton |
  #6 (permalink)  
Antiguo 17/03/2005, 08:01
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 9 meses
Puntos: 4
Cita:
Iniciado por Calisco
Podria ser esta una propiedad de la clase de que en funcion del valor de la misma la clase 'sepa' el motor a utlilizar ?.
Deberia estar en el constructor de la clase ?
Me contesto a mi mismo. Estuve observando ADOdb y la forma de especificar al objeto a que motor conectarse es mediante un metodo de la clase y que no esta en el constructor.

Para conextarse con MySql usa la siguiente sintaxis

$conn = &ADONewConnection('mysql');
$conn->PConnect('localhost','usuario','contraseña','data base');
__________________
| Cabeza De Raton |
  #7 (permalink)  
Antiguo 17/03/2005, 09:30
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 23 años
Puntos: 129
Pero .. eso es parte del "diseño" de tu capa de abstracción de BD .. Sin ir más lejos .. el ejemplo que dejó: marlx más arriba tan sólo puede (por qué así se diseñó) usar un RDBMS que es Mysql, sin embargo "ADOdb" puede y tiene la virtud de poder usar unas cuantas a elección .. Los "métodos" son de nombre igual para las "acciones" típicas como "conectarse" .. hacer una consulta .. obtener sus resultados .. lo que cambia será el método que defina donde se le dice que BD usar o forma de hacerlo.

Todo lo demás con respecto a tu "modelo de datos" de tu BD lo definiras haciendo tus consultas SQL (Lenguaje estructurado de consultas) que debes usar para "obtener" los datos que requieras de TU bd .. Lo mismo podrías hacer con funciones directas para X base de datos concreta: .. ejemplo mysql_connect() y todo el grupo de funciones de www.php.net/mysql para mysql ..


Un saludo,
  #8 (permalink)  
Antiguo 17/03/2005, 11:51
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 9 meses
Puntos: 4
Gracias de nuevo.
Yo he visto que muchas clases directamente pasan en un string la consulta MySql a ejecutar. A mi esto es como que "me da cosa"; pienso que por ahi seria mas comodo utilizar consultas personalizadas o metodos personalizados de la clase ... pensando sobre la marcha se podria hacer una clase madre general que ejecute consultas MySql mediante parametros tipo string y ... luego, hacer una clase heredada mas particular abocada a mi trabajo en particular.
No se si se entiende ...
__________________
| Cabeza De Raton |
  #9 (permalink)  
Antiguo 17/03/2005, 12:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 23 años
Puntos: 129
Si, .. de eso se trata si piensas trabajar "Oriendato a objetos" totalmente ..

Debes tener una "capa" básica para comunicarte con tu sistema de almacenamiento de la información (lease: Base de datos .. cualquiera .. o un XML o un archivo de texto plano .. etc). y de ahí crear tus "objetos" que definen propiedades de tu "negocio" (de tu lógica).

Como en un ejemplo anterior te expuse .. tu puedes crearte un método que para tu aplicación haga algo tipo: "dame datos cliente" .. el "donde estarán esos datos" tus objetos ya se comunicaran para extraer de la fuente de datos original esos datos y entregarlos al objeto que controle la "vista" (yo de OOP no dominio nada .. pero por ahí va la cosa .. seguro que aquí te orientan mejor al respecto).

Un saludo,
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 03:01.