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

Pregunta sobre FAQ "Conexión y ejecución con MySQL"

Estas en el tema de Pregunta sobre FAQ "Conexión y ejecución con MySQL" en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, no tengo mucha experiencia con clases y objetos en php pero me interesa el tema y las posibilidades que da. Hice algunas clases de ...
  #1 (permalink)  
Antiguo 10/01/2006, 00:11
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Pregunta sobre FAQ "Conexión y ejecución con MySQL"

Buenas, no tengo mucha experiencia con clases y objetos en php pero me interesa el tema y las posibilidades que da. Hice algunas clases de prueba, leí al respecto y entiendo por qué muchas veces usar objetos simplifica el código, ahorra trabajo, da modularidad y flexibilidad, etc.

Ahora, el tema es el siguiente. Vi varios ejemplos, en otros foros y en este también, de clases para conectarse a un server MySql, hacer consultas, etc. Lo que no me queda claro es cuál es la ventaja de usar objetos para manejar este tipo de tareas.

Es decir, una clase que básicamente lo que hace es replicar los funciones de mysql, transformarla en métodos de objeto y devolver lo mismo que devuelve la función original... ¿qué aporta?

No simplifica o ahorra código, me parece. El mismo ejemplo, usando un objetos vs funciones:

Código PHP:
$obj=new conectarMySQL("SERVIDOR","USUARIO","PASSWORD","BASE DE DATOS");
$obj->conectar();
$obj->consultar("select * from urls limit 0,10");
while(
$row=$obj->obtendatos()) {
    echo 
"<br><a href=".$row['url'].">".$row['title']."</a>";
}
$obj->limpiaconsulta();
$obj->cerrarconexion(); 
8 líneas.

Usando las funciones mysql:

Código PHP:
$link mysql_connect("myServer","usr","pass") or die ("mensaje de error, etc");
mysql_select_db("base",$link) or die ("mensaje de error, etc");
$consulta mysql_query("select columna from tabla"$link);
while(
$rs=mysql_fetch_row($consulta) {
    echo 
$rs[0] . "<br>";
}
mysql_free_result($consulta);
mysql_close($link); 
8 líneas, también, que cualquiera entiende sin leer el código de una clase (o ver documentación, llegado el caso), y que evitan escribir unas cuantas líneas más para definir una clase.

O sea, hacerlo con clases es el mismo o más trabajo (más bien diría que más), y el único cambio son los nombres de las llamadas. A cambio, estamos ocupando más recursos del sistema. El tema de la reusabilidad dificilmente pueda ser un argumento en este caso.

Bueno, tal vez si se agregara algún tipo de manejo de errores más complejo a la clase u otra cosa, le vería más sentido, pero la verdad es que, como está, no le veo mucho.

Como decía, recién empiezo con clases/objetos así que puede que no esté viendo algo que sea evidente para alguien con más experiencia en el tema. La idea de este post es, justamente, recabar argumentos a favor (o en contra) de usar clases/objetos para este tipo de situaciones. Me gustaría saber cuáles serían para ustedes las ventajas/desventajas de cada caso.

Muchas gracias.

Califa
  #2 (permalink)  
Antiguo 10/01/2006, 06:02
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
El tema creo que no pasa por usar más o menos líneas .. sino el hecho de usar POO o programación estructurada clásica.

Al usar POO para este caso heredas todas las ventajas de la POO .. Si tu creas un objeto para conectarte a una BD como pueda ser este que -sólo- lo hace hacia Mysql .. lo primero que consigues es "separar" el código de la conexión y manejo de tu BBDD del código de tu aplicación en sí que trabaja con esos datos ("capa de negocios"?).

Así como está dicha clase lo primero que te permite es realizar conexiones diferentes a otras BBDD mysql (de la misma BBDD u otras) tan sólo creando una instancia nueva del objeto principal .. Eso a base de "funciones própias" no puedes re-usarlas salvo que gestiones "links" de conexión diferentes y crees funciones con nombres diferentes (sobre todo la que conecte a tu BD y se autentifique) .. En fin .. un trabajo "laborioso" y a un paso de usar realmente POO .. lo cual ya lo haría "por defecto".

Ejemplo .. imagina un traspaso de datos entre un servidor Mysql A y B:

Código PHP:
$obj=new conectarMySQL("SERVIDOR","USUARIO","PASSWORD","BASE DE DATOS"); 
$obj2=new conectarMySQL("SERVIDOR2","USUARIO","PASSWORD","BASE DE DATOS"); 

$obj->conectar(); 
$obj2->conectar();

$obj->consultar("select * from urls limit 0,10"); 
while(
$row=$obj->obtendatos()) { 
    echo 
"Pasando: Mysql A:".$row['url']."> Mysql B"
    
$obj2->consultar("INSERT INTO tabla (id,campo) ('','".$row['url']."')";
    
$obj2->limpiaconsulta();

$obj->limpiaconsulta(); 
$obj->cerrarconexion(); 
$obj2->cerrarconexion(); 
Como bien dices .. tal vez este ejemplo concreto para una capa de abstracción no sea el mejor ejemplo para describir las "virtudes" de usar POO para acceder a una BBDD .. pero te paso otro ejemplo en el que creo que veras mejor el por qué usar POO:

AdoDB
http://adodb.sourceforge.net/

Esta classe tiene métodos para que "eligas" con que BBDD vas a trabajar .. no sólo "Mysql" sino vaías más. Tu usas el mismo nombre de métodos, la misma forma de trabajar sea cual sea el motor de BBDD que te conectes. De hecho, eso se usa para hacer aplicaciones que puedan funcionar sin cambios de código bajo el rango de RDBMS's que la capa de abastracción gestione.

El hecho de tener centralizado todo sobre un objeto hace que por ejemplo puedas crear otros objetos que extiendan al padre para añadirle funcionalidades nuevas sin tener que re-escribir nada más de código ni afectar al que ya esté creado y usandose, además de heredar todoooo lo que el objeto padre definió en su momento.

Otra variante .. no usa métodos para seleccionar la BD sino que cambia la "classe" entera a usar. Sólo se basa en respetar el nombre de los métodos y lo que entregan o aceptan cuando se crea un nuevo módulo para acceso a un RDBMS diferente.

ezSQL
http://www.jvmultimedia.com/home/art...hp?articleId=2

Un saludo,

Última edición por Cluster; 10/01/2006 a las 08:42
  #3 (permalink)  
Antiguo 10/01/2006, 08:28
Avatar de biblio  
Fecha de Ingreso: enero-2002
Ubicación: Urano
Mensajes: 577
Antigüedad: 22 años, 3 meses
Puntos: 0
Cita:
O sea, hacerlo con clases es el mismo o más trabajo (más bien diría que más), y el único cambio son los nombres de las llamadas. A cambio, estamos ocupando más recursos del sistema. El tema de la reusabilidad dificilmente pueda ser un argumento en este caso.
Antes de sacar conclusiones, yo sugiero que leas mas, el ejemplo de cluster creo que es bastante claro cuando por medio de una clase puedes conectarte a 2 servidores, y no solo 2 podria ser mucho mas.

Saludos
  #4 (permalink)  
Antiguo 10/01/2006, 11:07
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Cluster, muchas gracias por tu resupuesta, los links y los ejemplos, muy claros. Efectivamente, no estaba viendo algo evidente para alguien con más experiencia con clases/objetos. Ahora entiendo algunas ventajas que puede dar trabajar así, aun cuando en principio sólo uses mysql. En un futuro, ampliarte a otras bases es bastante fácil, sólo hay que modificar la clase, en un sólo lugar, y el código que la usa queda igual...

Biblio: de acuerdo. Lo que pasa es que no veía la ventaja y por eso pregunté. Igual, era una "conclusión" provisoria, o más bien, estaba pensando en voz alta.

Saludos y gracias a los dos.

Califa
  #5 (permalink)  
Antiguo 04/03/2006, 20:44
Avatar de bistoco  
Fecha de Ingreso: marzo-2006
Mensajes: 141
Antigüedad: 18 años, 1 mes
Puntos: 0
tambien tengo una clase de conexion a base de datos ,y encontre otra ventaja , si se usan querys en sql estandar se puede tener una aplicaion ke trabaje con la mayoria de los motores de base de datos tan solo cambiando la clase de conexion
  #6 (permalink)  
Antiguo 04/03/2006, 20:45
Avatar de bistoco  
Fecha de Ingreso: marzo-2006
Mensajes: 141
Antigüedad: 18 años, 1 mes
Puntos: 0
tambien tengo una clase de manejo de base de datos y encontre otra centaja, si se ultilizan querys en sql standar , la aplicacion completa se puede utilizar con la mayoria de los motores de base de datos
  #7 (permalink)  
Antiguo 05/03/2006, 01:10
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años
Puntos: 2
Cita:
interfaz : es una colección de operaciones que se usa para especificar el servicio que debe de proporcionar una clase o un componente
es decir que una inferfaz (interfase) define una línea de separación entre lo que una abstracción hace y la implementación de como lo hace
Es probable que el termino no lo veas claro en este momento, pero supongamos que tu tienes una aplicación sencilla que almacena sus datos en una sola tabla supongamos que en MySQL como es tu caso, bien terminas tu aplicación y todo esta trabajando bien usando la API que proporciona php como en tu ejemplo:
Código PHP:
$link mysql_connect("myServer","usr","pass") or die ("mensaje de error, etc");
mysql_select_db("base",$link) or die ("mensaje de error, etc");
$consulta mysql_query("select columna from tabla"$link);
while(
$rs=mysql_fetch_row($consulta) {
    echo 
$rs[0] . "<br>";
}
mysql_free_result($consulta);
mysql_close($link); 
Ahora supongamos que te topas con la necesidad de usar algunas ventajas de MySQL 4.1+ y esto implica que ahora tienes que rescribir tu ejemplo para usar la extensión mejorada con lo que tiene que cambiar varias líneas para obtener el mismo resultado, y después de eso resulta que alguien te pide que hagas lo mismo con tu aplicación pero que los datos se guarden en MS SQLServer y otro mas que no le gusta mysql por que ya tiene Oracle8i o Oracle9i con lo que tienes que hacer nuevos cambios que implican nombre diferente de funciones y además de lo necesario para que tu aplicación cargue la API correspondiente a usar, etc.
Y es aquí donde te das cuenta de que requieres algo mas, para solventar tu problema y de tanto hacer lo mismo se comienza hacer intuitivo el echo de que sin importar el medio que uses al final casi siempre son las mismas operaciones las que realizas es decir
  • conectar al RDBMS
  • Realizar consulta
  • liberara memoria
  • cerrar conexión
lo que cambia es como haces esas operaciones en cada caso, Y es donde el termino de Interfaz se vuelve útil y junto con ello la POO. Ya que como una interfaz define como se deben de declara las operaciones obliga a cada clase a cumplir con la implementación de sus métodos y con eso creas un punto común para acceder cualquier RDBMS y el poder real esta en que si el día de mañana necesitas conectarte a otra cosa tu interfaz no cambia ( en un caso ideal) solo cambia la implementación de la misma y con eso tus aplicaciones solo necesitan tratar con la intefaz y no con sus implementaciones dejando sin cambio las mismas.
La potencia de POO no esta en crear contenedores de funciones que puedes mover como un todo, si no en comprender sus conceptos y aplicarlos en este caso con el concepto de interfaz que aprovecha la idea de la herencia para su implementación.
__________________
Saludos!
Mty-NL..
  #8 (permalink)  
Antiguo 05/03/2006, 03:35
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años
Puntos: 2
En termino de UML nuestro diagrma de lo que explique en el mensaje anterior puedria verse de la siguiente forma:

Como se puede ver del lado izquierdo tenemos una clase con un método de fabricación que nos proporcionar la implementación de la interfase IBDatos que necesite nuestra aplicacion en este caso BDatos_MySQL, BDatos_MySQLi, BDatos_MSSQL.
El diagrama es sugerido así que los detalles de implementación o detalle del diagrama o cambio al mismo queda a criterio de cada quien.
__________________
Saludos!
Mty-NL..
  #9 (permalink)  
Antiguo 15/03/2006, 01:53
Avatar de rasmarko  
Fecha de Ingreso: noviembre-2002
Ubicación: México
Mensajes: 78
Antigüedad: 21 años, 5 meses
Puntos: 1
En el post de cluster tiene razón que es el simple hecho de utilizar la programación estrcuturada de POO pero califa010 tiene una parte de razón...

Ah decir verdad se podria disminuir el trabajo.
Regularmente usamos una sola conexión a base de datos.

Un ejemplo de algo reducido sería:

Código PHP:
<?php

$objeto 
= new Mysql(); // conecta y selecciona BD
$objeto->sentencia("SELECT * FROM `urls` LIMIT 0,10");

$contar $objeto->resultados();

while(
$campo $objeto->listarMatriz()) {
echo 
"<a href=".$campo['url'].">".$campo['title']."</a>";
echo 
"<br/>";
}

$objeto->cerrarMysql(); // mysql_free_result + mysq_close

echo "Resultados: ".$contar;


?>
Puedes agregarle a la class varias funciones y facilidades, la verdad que SÍ se puede disminuir el codigo, he tenido la creencia ilusa que en PHP POO se puede crear, como en física, "La teoria de todo" o en inglés como llama Sthepen Hawking... "Theory Of Everything"
__________________
Fuentes - Diseweb - Frases Célebres
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 21:48.