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;
}
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";
?>