Foros del Web » Programando para Internet » PHP »

Problema con consultas remotas usando un wrapper

Estas en el tema de Problema con consultas remotas usando un wrapper en el foro de PHP en Foros del Web. Hola a todos, Os voy a presentar un problema que me está volviendo loco estos últimos días. Paso a paso es esto: 1.- Tengo una ...
  #1 (permalink)  
Antiguo 20/07/2007, 15:19
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 18 años, 6 meses
Puntos: 0
Problema con consultas remotas usando un wrapper

Hola a todos,

Os voy a presentar un problema que me está volviendo loco estos últimos días.
Paso a paso es esto:
1.- Tengo una web "principal" desde la que creo y edito contenido en un campo de texto WYSIWYG (TinyMCE).

2.- El texto escrito en ese campo (que incluye algunas etiquetas HTML, como <p>,<b>,etc.) será publicado en otras webs "satélite" que están alojadas en hostings distintos. Para eso, la consulta mysql que hay que construir tiene que ser algo especial, es decir, tiene que usarse un wrapper de las funciones mysql.Esto lo explico a continuación. La función "ejecutarConsultaRemota(...)"(desde la web principal) construye una url con las variables $_Get necesarias para conectarse a la base de datos y la consulta en sí. Luego con fopen se abre esa URL que ejecuta la consulta en la web satelite y se recoge el resultado con fgets. El resultado es un array que tiene varios campos (error, id de la última fila insertada y el resultado de la consulta).

Cuando hago un insert de un texto plano sin formato (sin etiquetas html, sólo letras y algunos símbolos .,!?¿) no tengo problema. Se ejecuta la consulta con éxito.
Si incluimos etiquetas tales como <b>...<p>..etc, la cosa funciona algunas veces y otras veces no. Parece que cuando se insertan esas etiquetas el host destino recibe una consulta "corrompida" con caracteres raros cuando empiezan las etiquetas.

No lo entiendo y me estoy volviendo loco. A ver si alguien puede lanzarme algo de luz en el asunto. Muchas gracias.

Función que, desde la web principal, ejecuta una consulta en una web satélite:

Código PHP:
function ejecutarConsultaRemota($query,$dbserver,$dbuser,$dbpass,$dbname,$url){
    
//si el ltimo caracter no es " / " lo aadimos
    
$pos_barra strrpos($url"/");
    
$long_cad strlen($url);
    if(
$pos_barra != ($long_cad -1)){
        
$url .= "/";
    }

    
$url .= "wrapperMySQL.php?";
    
$url .= "dbserver=".$dbserver;
    
$url .= "&dbuser=".$dbuser;
    
$url .= "&dbpass=".$dbpass;
    
$url .= "&dbname=".$dbname;
    
$url .= "&query=";
    
//para la codificacin utf8
    
$query utf8_encode($query);
    
    
$query base64_encode($query);
//    echo $query ;
    
$url .= $query;
    
$fp fopen($url,'r');

    
$read '';
    while(!
feof($fp)) { $read .= fgets($fp); }
    
fclose($fp);
    
//hasta aqu , $read tendr mucho cdigo basura que hay que eliminar
    //nos quedamos SOLO con lo que hay entre las etiquetas :
    //INICIO_RESULTADO_CONSULTA y FIN_RESULTADO_CONSULTA
    //procesamos el $read
    //...
    
$pattern1 "^.*INICIO_RESULTADO_CONSULTA"//patron para eliminar todo lo anterior a la consulta
    
$pattern2 "FIN_RESULTADO_CONSULTA.*$"// patron para eliminar todo lo posterior a la consulta
    
$read ereg_replace($pattern1,"",$read);
    
$read ereg_replace($pattern2,"",$read);
    
//LA PRIMERA CASILLA DE $read ES EL ERROR $error["num"]["msj"]
    
$read unserialize(base64_decode($read));
     return 
$read;

Archivo que se guarda en las webs destino que hace de "wrapper" de las consultas:
Código PHP:
<?
// OJO, proteger  este archivo con contrase�a.
//este archivo debe ir en el directorio raiz de cada host DUMMY

//funciones que realiza:
// 1.- Ejecuta una consulta
//2.- Guarda los errores 
//3.- Guarda el insert_id

    
$error = array();
    if(!(
$link mysql_connect($_GET["dbserver"],$_GET['dbuser'],$_GET['dbpass'])))  $error["connect"] = 1// si es false, lo guardamos para saberlo (si no, tb se guarda el link)
    
else $error["connect"] = 0;

    if(!
mysql_select_db($_GET['dbname'],$link))     $error["select_db"] = 1;
    else 
$error["select_db"] =  0;
    
    
$query base64_decode($_GET['query']);
//    echo $query;exit;
    
$query utf8_decode($query);
    
$result mysql_query($query,$link);
    
$output = array();
    
//la primera posici�n del array la reservamos para el c�digo de error
    //metemos un array de dos elementos, el primero es el c�digo de error, y el segundo, el mensaje
    
$error["query"]["num"] = mysql_errno($link);
    
$error["query"]["msj"] = mysql_error($link);
    
$output["error"] = $error;
    
$output["insertid"] = mysql_insert_id($link);
    
$output["query"] = $query;
//    print_r($error);exit;
    //en este punto $ouput["error"] devuelve un array con dos posiciones
    // $output["error"]["num"] --> n�mero de error
    // $output["error"]["msj"] --> mensaje de error
    
while($row = @mysql_fetch_assoc($result)) { $output[] = $row; }
    
print_r($error);
    echo 
"INICIO_RESULTADO_CONSULTA";
    echo 
base64_encode(serialize($output)); 
    echo 
"FIN_RESULTADO_CONSULTA";

?>
  #2 (permalink)  
Antiguo 20/07/2007, 15:39
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años, 1 mes
Puntos: 33
Re: Problema con consultas remotas usando un wrapper

Si estas teniendo problemas con la información que viene de editor te recomiendo, que esa información antes de almacenarla uses htmlentities() y cuando la recuperes y las vayas a mostrar usas html_entity_decode()

Saludillos.
  #3 (permalink)  
Antiguo 22/07/2007, 17:22
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 18 años, 6 meses
Puntos: 0
Re: Problema con consultas remotas usando un wrapper

Gracias.
Voy a probar, ya diré algo cuando lo compruebe.
;)
  #4 (permalink)  
Antiguo 23/07/2007, 10:45
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 18 años, 6 meses
Puntos: 0
Re: Problema con consultas remotas usando un wrapper

Pues sí, al final me ha funcionado haciendo uso del htmlentities y una función inversa unhtmlentities que alguien colgó en el foro de php.net. (no m servía el html_entity_decode() ).
Muchas gracias!
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 02:54.