Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Varias consultas al servidor en una funcion

Estas en el tema de Varias consultas al servidor en una funcion en el foro de Frameworks JS en Foros del Web. Buen dia compañeros del foro: Se que puede que este cometiendo un error publicando una pregunta, pero no tengo a nadie mas a quien recurrir. ...
  #1 (permalink)  
Antiguo 02/07/2008, 10:30
 
Fecha de Ingreso: julio-2008
Mensajes: 10
Antigüedad: 15 años, 9 meses
Puntos: 0
Exclamación Varias consultas al servidor en una funcion

Buen dia compañeros del foro:

Se que puede que este cometiendo un error publicando una pregunta, pero no tengo a nadie mas a quien recurrir.

Resulta pues que estoy haciendo una aplicacion WEB que usa PHP, HTML, JAVASCRIPT, el objeto XMLHttpRequest y un pequeño APPLET para acceder a unos archivos del cliente.

He pasado por mil penurias para lograr hacer algunas cosillas, pero tengo un problema bastante jarto del que no he podido hallar una solución.

Tengo funciones dentro de JavaScript de la forma:

function cualquiera(JSON){
if(JSON == null){
sql(campos,accion,"pagina.php",cualquiera);
}else{
/* Se procesa la respuesta del servidor */
}
}

Me explico:

1. No uso XML para recibir las respuestas del servidor porque me parece mas mamon usar DOM para manipular los resultados. Mas bien desde PHP creo una cadena de caracteres con notacion JSON, la cual se convertira en un objeto en javascript por medio de la funcion EVAL().

2. sql() es una funcion que hace las veces de puente para enviar querys a la pagina PHP, a la cual se le envian los siguientes parametros:

campos: Array que contiene hasta 6 cajones los cuales corresponden a cada parte de un query, como son los campos a consultar, las tablas a accesar, las condiciones que debe cumplir, etc. Mejor dicho todo lo que lleva una sentencia SQL, que ya esta parametrizada en una pagina PHP.

3. sql() adicionalmente tiene la particularidad de que necesita que se le envie el nombre de la funcion que debe manipular la respuesta para cuando el servidor responde (lo que es necesario ya que la respuesta es asincrona, osease en cualquier momento).

El problema radica en que, de la forma que lo tengo planteado, una funcion solo es capaz de hacer un requerimiento al servidor y tenido problemas con aquellas tablas que requieren que requieren de registros en otras tablas maestras o padre (como se les llama en bases de datos).

La posible solucion es que tenga que implementar tantas funciones como peticiones al servidor tenga que hacer, pero creo que debería haber otra forma.

Cualquier sugerencia al respecto es bien recibida, porque como digo no tengo a nadie mas a quien recurrir, puesto que he leido ya bastante al respecto pero no se me ocurre algo distinto.

Archivos Implicados:

XHR.js

var READY_STATE_UNINITIALIZED=0;
var READY_STATE_LOADING=1;
var READY_STATE_LOADED=2;
var READY_STATE_INTERACTIVE=3;
var READY_STATE_COMPLETE=4;

// var peticion_http;

function inicializa_xhr(){
// Crear el objeto XMLHTTPRequest
if(window.XMLHttpRequest){
return new XMLHttpRequest();
}else if(window.ActiveXObject){
return new ActiveXObject("Microsoft.XMLHTTP");
}
}

function crea_query_string(campos){
//Cadena con parametros para el servidor
var cadena = "";
var campo;
for(i=0;i<campos.length;i++){
cadena = cadena + campos[i];
if((i+1) != campos.length)
cadena = cadena + "&";
else
cadena = cadena + "&nocache=" + Math.random();
}
return cadena;
}

function init(peticion_http,campos,url,funcion,sincronismo) {
/* Funcion que realiza todo el proceso
* peticion_http: objeto XMLHTTPRequest a utilizar
* Campos: Son los parametros que se van a enviar al servidor
* Encaso de que sea null, solo devolverá valores
* url: es el script en el servidor
* funcion: es la que se encargará de procesar la respuesta
* sincronismo: Determina si se espera o no la respuesta del servidor
*/
// peticion_http = inicializa_xhr();
if(peticion_http){
peticion_http.onreadystatechange = funcion;
peticion_http.open("POST",url,sincronismo);
if(campos != null)
var query_string = crea_query_string(campos);
else
var query_string = null;
peticion_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
peticion_http.send(query_string);
}else{
alert("El objeto XMLHTTPRequest no ha podido ser creado");
}
}

modAdmin.js

function sql(campos,accion,php,funcion){
var ajax = inicializa_xhr();

init(ajax,campos,php + "?funcion=" + accion,recibir,true);

function recibir(){
if (ajax.readyState == READY_STATE_COMPLETE) {
if (ajax.status == 200) {
if (ajax.responseText == "errorTabla"){
alert("Error al accesar la tabla de la BDD");
}else if (ajax.responseText == "error") {
alert("No se pudo accesar la base de datos");
}else if (ajax.responseText == "bien"){
alert("La operación se ha realizado satisfactoriamente");
}else if (ajax.responseText == "no_registros"){
alert("No se encontraron registros");
}else if(ajax.responseText.substr(0,1) == "<"){
mostrar_W()
var cadena = "<input type='button' id='cerrar' class='boton' value='CERRAR'><BR>" + ajax.responseText;
document.getElementById("white_w").innerHTML = cadena;
document.getElementById("cerrar").onclick = cerrar_W;
}else{
j_son = eval("(" + ajax.responseText + ")");
if(funcion != null) funcion(j_son);
/*try{

/*}catch(e){
alert("Error al procesar la respuesta del servidor");
alert("Verifique su parametro de busqueda");
}*/
}
}
}
}
accion = 0;
}


Por si algo,

accion = 1, significa hacer un SELECT
accion = 2, un INSERT
accion = 3, un UPDATE
accion = 4, un DELETE
accion = 5, averiguar quien diablos esta manipulando la pagina, variables de SESSION.
  #2 (permalink)  
Antiguo 02/07/2008, 13:18
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Respuesta: Varias consultas al servidor en una funcion

loading...........

Bueno creo que necesitas la idea como PROPEL hace Inner JOIN de sus tablas.

http://propel.phpdb.org/trac/

puedes ver el código y entender como lo hacen ellos.

connection closed.
__________________

Maborak Technologies
  #3 (permalink)  
Antiguo 02/07/2008, 13:50
 
Fecha de Ingreso: julio-2008
Mensajes: 10
Antigüedad: 15 años, 9 meses
Puntos: 0
De acuerdo Respuesta: Varias consultas al servidor en una funcion

Gracias Maborak por contestar (hace rato que veia tus conexiones temporales por el foro).

Voy a leer de que se trata el proyecto, y puclicaré mis avances para ver si le hallo solución a esto.

Salu2
  #4 (permalink)  
Antiguo 03/07/2008, 08:18
 
Fecha de Ingreso: julio-2008
Mensajes: 10
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Varias consultas al servidor en una funcion

He leido un poco acerca de PROPEL, pero no entendí ni papa.

Propel, segun cuentan en la pagina, es un FRAMEWORK que permite crear objeto a partir de una base de datos usando scripts de PHP.

La verdad no veo como pueda beneficiar esto a mi aplicación, la que estoy prcocurando mantener lo mas facil de entender y programar posible. Una de las razones, es que debe estar diseñada para un ancho de banda considerablemente reducido.

Por otra parte un compañero de la universidad me ha dicho que trate de hacer varias consultas al servidor, una tras otra segun las valla necesitando, pero caigo en dos cosas:

1. Que tendría que dividir cada peticion en una funcion independiente para poder recibir su resultado.
2. Que gracias a que la respuesta del servidor es asincrona, no puedo controlar que les respuestas lleguen a tiempo para cuando se este ejecutando un hilo de codigo. Por ejemplo, hago una consulta, de la cual necesito un dato, y mas adelante hago un insert que necesita un dato de la consulta anterior, pero resulta que el servidor no ha responido aún, TONS???

Eso como para ponerle casi todas las patas que me han salido, a este cojo de aplicación.
  #5 (permalink)  
Antiguo 08/07/2008, 14:08
 
Fecha de Ingreso: julio-2008
Mensajes: 10
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Varias consultas al servidor en una funcion

Perdonen por inisistir:

Tengo problemas con este asunto y no he podido solucionarlo. Otro ejemplo, en una función voy a hacer una inserción sobre una tabla, pero resulta que necesito hacer un select para recoger unos datos de otra tabla para poder hacerla correctamente.

Que solución me sugieren, es que si hago las dos peticiones una tras de otra en la misma función, como la respuesta es asincrona, no tengo control de cuando llega y puede suceder que los datos no lleguen a tiempo, o un resultado inesperado, pues cuando llega la primer respuesta la ejecución del código se detiene.

HEEEEEEEEEEEEEEEEEEEEEEEEEEEEELLLLLLLLLLLLLLLLLLLL LLLPPPPPPPPPPPPPPPPP!!!!!
  #6 (permalink)  
Antiguo 09/07/2008, 10:08
 
Fecha de Ingreso: julio-2008
Mensajes: 10
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Varias consultas al servidor en una funcion

Gracias de todas maneras...

Sabía de antemano que ninguno iba a querer contestar ...

Hace mas uno leyendo sin preguntar que preguntando directamente ....
  #7 (permalink)  
Antiguo 17/07/2008, 17:15
Avatar de iandrade  
Fecha de Ingreso: septiembre-2006
Ubicación: Xalapa, Veracruz, MÉXICO.
Mensajes: 171
Antigüedad: 17 años, 7 meses
Puntos: 6
Respuesta: Varias consultas al servidor en una funcion

Cita:
Iniciado por starex_rex Ver Mensaje
1. No uso XML para recibir las respuestas del servidor porque me parece mas mamon usar DOM para manipular los resultados. Mas bien desde PHP creo una cadena de caracteres con notacion JSON, la cual se convertira en un objeto en javascript por medio de la funcion EVAL().
Podra parecer "mamon" emplear XML, aunque le demas seguridad a tu sitio y consultas, no es mal plan utilizar JSON es solo que se me hace demasiado simple e inseguro ya que lo que le pases al eval lo ejecutara y si alguien suplanta tu identidad pues ya quiero ver a tus visitantes tolerando cosas que no tienen que ver, con XML y DOM no pasa porque lo que viajan son datos y al no emplear eval dificilmente podran atacarte.

Cita:
Iniciado por starex_rex Ver Mensaje
2. sql() es una funcion que hace las veces de puente para enviar querys a la pagina PHP, a la cual se le envian los siguientes parametros:
Al pasar la consulta de esta manera puede ser muy irresponsable ya que puden inyectar codigo mailicioso, veo que no programas con cautela, es conveniente ser mas precavido si no quieres que tus visitantes o tu mismo se pasen un mal rato.

Y finalmente te sugiero que no te excedas en el uso de conexiones en segundo plano porque podria darte como resultado algo que ni te esperas, recuerda que son asincronas y se te puedn colgar, reliza un mejor diseño de tu solucion y emplea las consultas y los niveles de seguridad minimos requeridos.
__________________
No todo lo que se hace en segundo plano es AJAX
  #8 (permalink)  
Antiguo 18/07/2008, 15:33
 
Fecha de Ingreso: julio-2008
Mensajes: 10
Antigüedad: 15 años, 9 meses
Puntos: 0
Exclamación Varias consultas al servidor en una funcion

Buen dia señor:

Sería tan amable usted de decirme donde puedo encontrar esos niveles de seguridad minimos requeridos????

GRacias por su amable respuesta.
  #9 (permalink)  
Antiguo 21/07/2008, 05:11
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Varias consultas al servidor en una funcion

starex_rex, por lo que he podido entender, controlas completamente desde Javascript la query que se va a lanzar a BBDD. Me imagino entonces que lo que tienes en PHP en el servidor será bastante simple y genérico, ¿no? Has hecho algo que puede recibir los datos de una query (tabla, campos) y monta la query y devuelve lo que salga, ¿correcto?

Hay varios problemas con esta forma de hacer las cosas.

1. El tema de la seguridad. Imagina que yo, desde mi navegador lanzo una petición a tu página pidiendo los campos usuario y password de la tabla usuarios (o cualquier cosa similar). Nunca hay que dejar que las querys se construyan desde el cliente.

2. Lo que tú mismo te encuentras ahora. Que hacer una query simple parametrizada es... simple. Pero hacer una query compleja parametrizada es... MUY complejo. Imagino que Maborak te decía que miraras Propel no para que lo uses, sino para que mires en su código cómo construyen ellos las querys. Además, si lo miras, verás que no es tan sencillo y que la casuística se amplía mucho más que para el caso de una query que sólo afecta a una tabla.


Mi consejo es:
1. Que pongas las querys en el servidor, no dejes que sea el cliente el que diga "dame esta tabla".
2. Que NO intentes hacer un sistema de querys genéricas parametrizadas. Haz querys para cada cosa que necesites. Es más, haz procesos en el servidor. Si una acción consiste en "buscar esta dato en esta tabla. multiplicarlo por tres, buscar este otro dato y sumarlo a lo que llevo. guardar el resultado en esta otra tabla y actualizar esta otra tabla con la hora de la acción", todo eso es un proceso y todo ello debe estar contemplado como un proceso. Y el lugar donde debe estar esa lógica de proceso es uno y el más adecuado es el servidor.

Por último decirte que está bien simplificar, hacer cosas sencillas, pero hay que "simplificar todo lo que se pueda, pero no más". A veces por hacer que las cosas sean sencillas acabamos complicándolo más de lo que deberíamos.
  #10 (permalink)  
Antiguo 21/07/2008, 06:49
 
Fecha de Ingreso: julio-2008
Mensajes: 10
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Varias consultas al servidor en una funcion

Huy que buena respuesta, Muchismas gracias....

La verdad es que cuando uno es novato peca por muchas cosas, y paga las novatadas a veces mas caro de lo que uno pudiera pensar.

La verdad es que he hecho las cosas así, pensando en los estandares de la W3C, que citan en alguna parte que las capas deben diferenciarse lo mejor posible.

Una cosa es HTML, otra JavaScript y otra PHP.

Lo que tu nombras de los procesos en el servidor lo habia pensado desde un principio y habia leido bastante acerca de la falta de seguridad en el codigo JavaScript, pero a fin de cuentas parece ser que no lo tuve en cuenta por tratar de hacer procesos estandares aplicables a todo lo relacionado con la pagina.

La verdad es que debo admitir que estas en lo correcto, y el problema que tengo de las consultas debe ser debido a eso, estoy haciendo las querys en donde no es.

Por esta razón he decidido probar XAJAX haber como me va en esta ocasion. AGRADEZCO mucho tu colaboración compañero y espero que esta vez me valla mejor.

Salu2
  #11 (permalink)  
Antiguo 22/07/2008, 10:09
Avatar de iandrade  
Fecha de Ingreso: septiembre-2006
Ubicación: Xalapa, Veracruz, MÉXICO.
Mensajes: 171
Antigüedad: 17 años, 7 meses
Puntos: 6
Respuesta: Varias consultas al servidor en una funcion

Hola perdona, no habia podido conectarme, pues de entrada muchos de tus problemas son de conceptualizacion(eso depende de ti, no hay guia) podran ayudarte lecturas como"Desarrollos de sistemas" o "Incluyendo niveles de seguridad en sistemas", Venkman ha hablado sabiamente; y para incluir los mecanismos minimos de seguridad, te recomiendo que mejor veas sitios de hacking, como? pues te doy una ayudita en el google pon "web hacking" y encontraras muchos sitios que te explican eso.

De manera general te puedo decir algunos de los que puedo ver, en tu exposición.
  • No pasar consultas o pseudoconsultas directas al servidor.
  • No dar la oportunidad al usuario de ejecutar codigo desde su consola.
  • Para los datos, emplear mecanismos propios para el manejo de los mismos (Base de datos, XML, etc).
__________________
No todo lo que se hace en segundo plano es AJAX
  #12 (permalink)  
Antiguo 22/07/2008, 10:15
 
Fecha de Ingreso: julio-2008
Mensajes: 10
Antigüedad: 15 años, 9 meses
Puntos: 0
De acuerdo Novatadas y mas novatadas

Gracias por la colaboracion y los comentarios. Supongo que los tres puntos anteriores deberían ser suficientes para empezar.

Lamentablemente no es mucho lo que se puede conseguir trabajando solo y peor aun sin saber que diablos es lo que se esta haciendo.

Seguire leyendo y espero encontrar los documentos mencionados.

Gracias y mil gracias. (Seguridad Ante todo)
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 15:41.