Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/07/2007, 15:19
raul123
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 18 años, 7 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";

?>