Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/07/2008, 10:30
starex_rex
 
Fecha de Ingreso: julio-2008
Mensajes: 10
Antigüedad: 15 años, 10 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.