En muchos servidores de host PHP-MySQL, algunos incluso de pago, no se permite la conexión remota a MySQL por cuestiones de seguridad. Normalmente esto no es un problema ya que la base de datos accedemos desde el propio espacio web y no se necesita la conexión remota.

Pero en otros casos sí puede ser necesario. Tengo un script que recoge datos de varias webs alojadas en distintos servidores y algunos no permiten la conexión remota a MySQL así que tuve que hacer un pequeño wrapper en PHP, muy sencillo, para salir del paso.

Se trata de un script que recoge los parámetros de conexión, una consulta SQL, la serializa, la codifica en base64 y la envía.

$link = mysql_connect("localhost",$_GET['user'],$_GET['pass']);
mysql_select_db($_GET['db'],$link);
$result = mysql_query(base64_decode($_GET['query']),$link);
$output = array();
while($row = @mysql_fetch_assoc($result)) { $output[] = $row; }
echo base64_encode(serialize($output));

Este archivo se situa en el servidor que no permite el acceso remoto a MySQL. Luego para leer estos datos en el servidor que desea acceder remotamente utilizamos este script:

$query = "SELECT * FROM table";
$url = "http://www.remoto.com/wrapper.php?";
$url .= "user=usuariomysql";
$url .= "&pass=passmysql";
$url .= "&db=dbmysql&query=";
$url .= base64_encode($query);
$fp = fopen($url,'r');
$read = '';
while(!feof($fp)) { $read .= fgets($fp); }
fclose($fp);
$read = unserialize(base64_decode($read));

Y si se protege la url http://www.remoto.com/wrapper.php con contraseña mejor todavía.

11 comentarios para “Conexión remota a MySQL no disponible”

  1. Marcos dice:

    Esta muy lograda esta solucion, pero se me plantea una duda: habria que probar si los tiempos de ejecucion son aceptables o que, alguien ha probado a hacerlo? se ejecutan las querys en un tiempo logico, o tardan demasiado?

    Gracias, un saludo.

  2. Geek dice:

    Depende de la conexión a la red que tengas los dos servidores.

    Evidentemente, una conexión directa a MySQL sería mucho más rápida, pero cuando no hay otra alternativa… esto te puede sacar de un apuro.

  3. lizzmar dice:

    estab buscando esto desde hace dias, y justo tengo que hacer una conexion a una base de datos de un servidor fuera de mi ciudad, no se si puedes enviarme mas detalles de tu script, soy una novata en esto, por lo que tengo varias dudas.
    Te deje mi mail espero me puedas ayudar. porfa :).saludos!!!

  4. lizzmar dice:

    probe su script pero tengo un error aca:
    $fp = fopen($url,’r');
    $read = ”;

    por que me sale lo siguiente:
    Parse error: parse error, unexpected T_VARIABLE in C:\xampplite\htdocs

  5. Geek dice:

    Faltaba un punto y coma (;) después de:

    base64_encode($query)

    Ya lo he arreglado, gracias por el aviso.

  6. Gaby dice:

    Tengo una BD en un servidor y me quiero conectar con una conexion remota ya tengo el usuario y el password pero no se como conectarme al servidor

    me podrias ayudar porfavor me urge mandame un correo gracias.

  7. Richard dice:

    Hola, esta muy interesante el script pero tengo un problema y es que no se como muestro los datos que se piden en la consulta… agradeceria un poco de ayuda…

  8. Geek dice:

    Hola,

    Haz var_dump($result); y así te harás una idea de cómo está estructurado el array.

  9. José dice:

    Me sale el siguiente error:

    “failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in RUTA”

  10. Geek dice:

    Tendrás que mirar el error.log del apache para ver qué problema está dando. Si no hay más detalles poco te puedo decir…

  11. José dice:

    Hola geek

    sucede que deseo conectarme remotamente al MySQL de mi Hosting e insertar en la base de datos de allá unos consolidados que genero de manera local. Implementé tu codigo pero me sale un warning, no sé a que se deba, si de permisos o algo asi.

    abajo te lo pongo:

    Warning: fopen(http://www.dominio.com/insertarvalores.php?user=usuario&pass=contrasena&db=nombredb&query=consulta=) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in /usr/local/apache/htdocs/aplicaciones/proyecto_b/sistema/siniestros_portal.php on line 160

    Agradezco te antemano tu colaboración

Deja tu comentario