Generar consultas SQL dinámicamente desde Flash para AMFPHP
Desde hace bastante tiempo, uso AMFPHP en la mayoría de los proyectos. Si ya lo habeis usado, sabreis lo cómodo, útil, y práctico que resulta, y si no lo habeis hecho, os recomiendo que lo descargueis y le hecheis un vistazo en cuanto tengais un rato.
Cuando llevaba un tiempo trabajando con él, me fastidiaba bastante tener que escribir un servicio de AMFPHP cada vez que quería realizar cualquier cosa, de modo que si un proyecto tenia seccion de noticias, galeria de fotos, novedades o lo que fuera, tenias que andar escribiendo un nuevo servicio por cada uno de ellos. Como no, si tenias que variar cualquier cosa en tu aplicacion, tenias que tocar la clase correspondiente, y el servicio, no era un trabajo dificil, pero si demasiado repetitivo …. ¿ Por que ?
Dandole vueltas, realmente te das cuenta que siempre haces lo mismo en un servicio, usas SELECT, INSERT, UPDATE y DELETE, esto cubre el 95% de los casos, y ocasionalmente, usas un SEARCH.
¿ Y si genero mi consulta SQL en flash, y simplemente uso un servicio único AMFPHP que haga de proxy ? De esta forma, me olvidaría por completo de tener que estar generando servicios constantemente, y ademas, podría generar todo desde flash, ahorrandome tener que pasar tantisimos parámetros …
A raíz de ahi, surgio la clase GenerateSQL. Es una clase que empece a usar hace un par de años, y que con el tiempo se ha ido refactorizando y portado a AS3. Su fucionamiento es bastante sencillo, una vez le coges el hilo, puedes generar consultas complejas muy muy rápido y directamente desde flash.
Vamos a un ejemplo sencillo, un típico SELECT :
/* param:
@elements: [nombre_columna_BD,......]
@tabla: tabla_BD
@myID: [[nombre_id,valor],….]
@limit: Number
@order: [nombre_columna_BD, order_type] - order_type: ASC // DESC
@option : AND // OR
*/
public static function GenerateSelect(elements:Array,tabla:String,myID:Array, order:Array, limit:Number, option:String = “”):String
Como vereis, hay opciones varias para generar el SELECT. El primer array, son las columnas a seleccionar, el segundo la tabla, el tercero las distintas condiciones ( WHERE …. ) y luego, distintas opciones de limite, ordenacion, y concatenación.
Al lío ( Ej. AS3 ) :
import GenerateSQL;
var tmpSTR:String = GenerateSQL.GenerateSelect ( [],”productos”,[],[],undefined,undefined );
trace(tmpSTR)
Resultado :
SELECT*FROM productos
Vale, esto es bastante básico, y sencillo. Vamos a algo un poco mas completo, voy a obviar los import y demas para ir a lo que nos interesa :
var tmpSTR:String = SQL.GenerateSelect ( ["id","nombre","apellidos"],”productos”,[["edad",15]],[],undefined,undefined );
y obtendríamos :
SELECT`id`, `nombre`, `apellidos`FROM productos WHERE `edad`=15
Bueno, ya veis como se pueden obtener facilmente consultas que van siendo mas complejas a medida que lo necesitemos. Es bastante cómodo ademas, puesto que siempre puedes ver exactamente “que” estas enviando a tu servicio, de modo que sabes perfectamente si hay un error en esa consulta, incluso si te apetece, pegas tu consulta generada en tu phpMyAdmin y ves que te genera.
No me extiendo más en esto, pues es sencillo probar y ver que tal funcionan los diferentes métodos, para los inserts, updates, deletes, y lleva dos métodos para generar búsquedas simples y complejas.
Una vez visto toda esta movida, vale, y ahora que ?. Esta consulta que generamos en flash, se la vamos a pasar a nuestro servicio de AMFPHP. Este servicio, siempre sera igual, no hay ni que tocarlo, y simplemente nos devolverá nuestro resultado perfectamente parseado como recordSet.
En el caso de enviar tanto un insert, update o delete, nos va a devolver simplemente un “ok”, o bien el error que haya generado el SQL.
Tampoco voy a entrar en como enviar los datos a tu servicio, pues esto esta bastante documentado en la red, y probablemente muchos de vosotros ya sepais como funciona, simplemente añadir, que no es para nada complicado.
Con esta clase, se hace bastante rapido ir desarrollando cualquier interaccion con la BD, me resulta super comoda para los insert y updates, pues normalmente recojo los datos en un array, y solo es pasarlo y fuera.
Importante. Como muchos habeis ya adivinado, usar este sistema asi “a pelo”, es muy muy peligroso. Te pueden inyectar código muy fácilmente, y hacerte un DROP de la leche …. ( Actualizo : Ojo a los permisos de la BD, con esto ya te ahorras muchos problemas… )
Ya depende de cada uno, y del proyecto, el establecer la seguridad que cada uno estime oportuna. Yo lo uso encriptando previamente desde flash, y desencriptando posteriormente en el propio servicio de AMF, de modo que la informacion viaje de forma segura permanentemente.
Aqui os dejo los archivos, la clase y el servicio, por si quereis hecharle un ojo :
Bueno, blog estrenado ! xD
- POSTS RELACIONADOS / IGUAL TE INTERESA ALGO ... No related posts
COMENTARIOS / 13 comentarios
Andrés Karp, el 20.10.2008 15:50Buenas Pishaaaaa, muy buen inicio de blog XD
Te manod un abrazo. saludos
emiliano velasco, el 21.10.2008 10:20Buen comienzo!!
Ya verás lo duro que es mantener el nivel éste
jajaja mucho éxito
![]()
Salute!
e
Fede Rivas, el 21.10.2008 11:46Gracias !!! Intentare seguir en la línea
Paco Moreno, el 21.10.2008 15:59[...] Así es como se define el nuevo blog de Fede Rivas. Este profesional de internet de Jerez de la Frontera; que mantiene y trabaja en su propia empresa (Pixerama) y a quien tengo un gran…
http://www.fcomoreno.net/index.php?action=fullnews&showcomments=1&id=355Felicidades amigo!! Estupendo el blog!!
Iván Gajate, el 30.10.2008 2:49Que pasa Fede!!
menuda sorpresa encontrarte aqui. Bien empezado, menudo nivelazo de salida.
Un saludo muy fuerte de Digramador a Digramador
admin, el 30.10.2008 13:33Muuchas gracias !!! Yo me alegro mucho de veros por aqui.
oscarlosan, el 20.11.2008 19:04[Importante. Como muchos habeis ya adivinado, usar este sistema asi “a pelo”, es muy muy peligroso. Te pueden inyectar código muy fácilmente, y hacerte un DROP de la leche.]
Hola, ahi va una preguntita:
si controlas la entrada de campos (solo permites numeros y texto) o si lees solo datos de la BD no te pueden inyectar código. NO??Muy buen blog. (Resuelve muchas de mis dudas)
Fede Rivas, el 20.11.2008 20:00Con los permisos de la BD puedes controlar gran parte del problema, pero claro, siempre acabas teniendo la necesidad de insertar datos, y deberias dejar el permiso de “insert”, de modo que tienes un agujero rapidamente.
Lo ideal es encriptar las llamadas, de modo que viajen “seguras”.
Me alegro que te guste el blog, y sobre todo, que te sirva de ayuda.
![]()
Salu2!!!
oscarlosan, el 25.11.2008 16:20hola, otra preguntita
que metodo puedo utilizar para encriptar?
Hay alguna biblioteca especial?
Estoy un poco pez en el tema de seguridad.Gracias.
Fede Rivas, el 25.11.2008 16:51Bueenas. Pues yo lo que uso, es una encriptacion AES de 256 Bits, de modo que flash, encripte con su clave de 256 bits, y envie la informacion encriptada, y una vez llega a PHP ( uso AMFPHP ) desencripto con la misma clave, obteniendo ya la consulta SQL.
Para flash, usa las librerias crypto de hurlant, y para PHP necesitas tener instalado mCrypt en el servidor para desencriptar.
Por supuesto, la key ha de estar en ambos sitios, tanto en flash como en PHP para que funcione el proceso.
Espero que te sirva de ayuda
oscarlosan, el 27.11.2008 11:08gracias.
TIM, el 25.03.2009 2:09Hola Fede, para muy pero que muy novatos en esto de flash -> bbdd, pudes por favor publicar un par de jemplos de como leer y escribir en una bbdd desde flash con contenido encriptado y usando tu clase?? para mi seria de grandisima ayuda .. ya mas de una vez le intenté meter mano a esto del php bbdd, pero mi programación quedo en actionscript nada mas ;( ahi queda la sugerencia, gracias!
Alexdw, el 24.10.2009 14:15No sabia de tu blog.. aunque veo que ya lleva tiempo activo.
Por cierto, has probado Zend framework para remoting… la verdad es que rinde bastante bien…despues de pasar por amfphp y weborb, definitivamente me quedo con Zend
DI ALGO !! / AÑADE TU COMENTARIO ...
