Foros del Web » Programando para Internet » PHP »

Restaurar base de datos desde fichero subido via http

Estas en el tema de Restaurar base de datos desde fichero subido via http en el foro de PHP en Foros del Web. Hola de nuevo por aquí con un problema que llevo dando vueltas dos meses y no encuentro la solución. Tengo en php una utilidad que ...
  #1 (permalink)  
Antiguo 01/06/2005, 11:24
 
Fecha de Ingreso: noviembre-2003
Mensajes: 50
Antigüedad: 20 años, 5 meses
Puntos: 0
Restaurar base de datos desde fichero subido via http

Hola de nuevo por aquí con un problema que llevo dando vueltas dos meses y no encuentro la solución.

Tengo en php una utilidad que en local recupera la base de datos mysql, hace una serie de operaciones y me crea un fichero de una de las tablas tabla.sql que subo con un formulario a un directorio denominado backup, al subir ese fichero se lanza una aplicación en el servidor que en teoria debería reataurar la base de datos con los nuevos datos que ha recuperado en local pero... ¡oh curiosidad! No incluye los nuevos productos, se queda en el día anterior que subí la base de datos, lo curioso es que si elimino el fichero tabla.sql de la ubicación desde la que deberia recuperarla en el servidor el script da error, osea que funciona, pero no lo hace corrrectamente.

Este es el codigo del formulario formenviar.php:
Código PHP:
<center>Enviar la base de datos:
<
form type="text" method="POST" action="enviar.php" enctype='multipart/form-data'>
<
input type="file" name="archivo" size="20" class="cajon">
<
INPUT TYPE="SUBMIT" value="Enviar base de datos" class="boton">
</
form>
</
center
y este enviar.php:

Código PHP:
<HTML>
<HEAD>
<TITLE>Formulario enviar</TITLE>
<link rel="stylesheet" type="text/css" href="../../css/gestion.css"> 
</HEAD>
<BODY>
<?require ("../conex.php");
$extensiones=array("html","exe","php");
$path="/home/httpd/vhosts/dominio.com/httpdocs/backup/";
$nombre=$HTTP_POST_FILES['archivo']['name'];
$tamanio=$HTTP_POST_FILES['archivo']['size'];
$tipo=$HTTP_POST_FILES['archivo']['type'];
$var explode(".","$nombre");
$num count($extensiones);
$valor $num-1;
for(
$i=0$i<=$valor$i++) {
    if(
$extensiones[$i] == $var[1]) {
    echo 
"Tipo de Archivo no admitido";
    exit;
    }
}
if (
is_uploaded_file($HTTP_POST_FILES['archivo']['tmp_name']))
 {
  
copy($HTTP_POST_FILES['archivo']['tmp_name'], "$path$nombre");
  echo 
"El archivo se ha subido correctamente al servidor, muchas gracias <p>";
  echo 
"Nombre: $nombre <p>";
  echo 
"Tamaño: $tamanio <p>";
  echo 
"Tipo: $tipo";
 }
else { echo 
"Error al subir el archivo"; }
echo 
"Su base esta siendo restaurada.......\n<br>";
$filename "/home/httpd/vhosts/dominio.com/httpdocs/backup/tabla.sql"
$executa "mysqldump --host=localhost --user=usuario --password=contraseña --opt basededatos tabla <$filename"
system($executa$resultado); 
if (
$resultado) { echo "<H1>Error ejecutando comando: $executa</H1>\n"; }
else {
echo 
"Fin. Su base está emplazada en su alojamiento.";
}
//Después de restaurarla borramos el fichero tabla.sql del servidor
$return = @unlink('/home/httpd/vhosts/dominio.com/httpdocs/backup/tabla.sql');
// Return FALSE if not found
var_dump($return);
?>
<br>
</BODY>
</HTML>
No sé qué puede fallar, si ejecuto el fichero tabla.sql desde phpmyadmin lo restaura perfectamente, pero desde el script no.

Agradecería una ayudita. Gracias
  #2 (permalink)  
Antiguo 02/06/2005, 06:42
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Y ... de la ejecución de ese script .. (como tienes algunos mensajes de exito/error) ... que obtienes? .. como para ver por donde pasa tu código?

Por lo demás .. tienes un @ en una función .. eso limita los mensajes de error que puedas obtener (no los veras) .. tal vez por ahí esté dando un error y no lo ves. Quita dicha @ y ejecuta nuevamente tu script a la espera de algún tipo de error.

Otro detalle:
$executa = "mysqldump --host=localhost --user=usuario --password=contraseña --opt basededatos tabla <$filename";

Supongo que cuando ahí dices "contraseña" .. será por qué ahí sustituyes tu contraseña "X" la que sea? lo mismo con usuario y demás ...

Más detalles:
$filename = "/home/httpd/vhosts/dominio.com/httpdocs/backup/tabla.sql";

por qué usas esa ruta absoluta "fija"? .. podrías usar $path$nombre que es realmente donde movistes tu archivo . .además de usar $_FILES en lugar de $HTTP_POST_FILES y no usar copy() sino move_uploaded_file() (que si bien en tu caso te puede funcionar todo así para subir tu archivo al servidor .. no es recomendable que lo uses así .. sobre todo si usas PHP 4.1.0 en adelante: por seguridad y por compatibilidad con configuraciones de PHP)

Un saludo,
  #3 (permalink)  
Antiguo 07/06/2005, 10:24
 
Fecha de Ingreso: noviembre-2003
Mensajes: 50
Antigüedad: 20 años, 5 meses
Puntos: 0
Hola cluster, gracias por contestar, he hecho caso de su sugerencias, he sustituido $HTTP_POST_FILES por $_FILES y copy() por move_uploaded_file(), he quitado la @ del unlink y todo sigue como antes, es decir no me da ningún error el script y se ejecuta normalmente, me dice que mi base de datos está siendo restaurada pero es mentira, ¿podría ser que el fichero anterior se quedara residente o temporal en el servidor y no me cogiera el que lo sustituye?

Sigo perdida...
  #4 (permalink)  
Antiguo 09/06/2005, 06:06
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
¿podría ser que el fichero anterior se quedara residente o temporal en el servidor y no me cogiera el que lo sustituye?
No, .. en "temporal" no .. pero si que puede ocurrirte que tu archivo no llega a donde indicas cuando haces el move_uploaded_file() .. o no tomas la ruta exacta donde está tu .SQL en la sentencia SQL ...

Para ver esto mejor .. las funciones como system() .. o exec() y afines tienen parámetros para obtener el resultado y salida que ocasiona la ejecución de tu comando .. tal vez tengas algún problema con la ejecución de "mysqldump" pero no lo vé desde PHP.

Revisa la documentación de:
www.php.net/system
ó usa exec() (que si que tiene más parámetro para obtener la "salida" que se ocasiona al ejecutar tu comando + errores de la ejecución en sí del comando ...)

Un saludo,
  #5 (permalink)  
Antiguo 16/12/2005, 10:02
 
Fecha de Ingreso: noviembre-2003
Mensajes: 50
Antigüedad: 20 años, 5 meses
Puntos: 0
Bueno, después de no pocos quebraderos de cabeza he conseguido solucionar el problema de restaurar la base de datos desde el fichero tabla.sql que subía a la ubicación backup de mi servidor.

El problema estaba en la restauración de dicho fichero, la línea de comandos que me ha funcionado ha sido:

mysql --host=localhost --user=usuario --password=contraseña basededatos < pathdelfichero/tabla.sql

Cuelgo el script por si le sirve a alguien.

Como siempre saludos a todos los que dedican un pelín de su tiempo a echar una mano a los novatos como yo.

Código PHP:
<?require ("conex.php");

set_time_limit(0);

//subimos el fichero tabla.sql

$extensiones=array("html","exe","php");
$path="/home/httpd/vhosts/dominio.com/httpdocs/backup/";
$nombre=$_FILES['archivo']['name'];
$tamanio=$_FILES['archivo']['size'];
$tipo=$_FILES['archivo']['type'];
$var explode(".","$nombre");
$num count($extensiones);
$valor $num-1;
for(
$i=0$i<=$valor$i++) {
    if(
$extensiones[$i] == $var[1]) {
    echo 
"Tipo de Archivo no admitido";
    exit;
    }
}
if (
is_uploaded_file($_FILES['archivo']['tmp_name']))
 {
  
move_uploaded_file($_FILES['archivo']['tmp_name'], "$path$nombre");
  echo 
"El archivo se ha subido correctamente al servidor, muchas gracias <p>";
  echo 
"Nombre: $nombre <p>";
  echo 
"Tamaño: $tamanio <p>";
  echo 
"Tipo: $tipo";
 }
else { echo 
"Error al subir el archivo"; }

//Restauramos la base de datos  leyendo el fichero tabla.sql
echo "Su base esta siendo restaurada.......\n<br>";

$executa "mysql --host=localhost --user=usuario --password=contraseña basededatos < ".$path.$nombre
system($executa$resultado); 
if (
$resultado) { echo "<H1>Error ejecutando comando: $executa</H1>\n"; }
else {
echo 
"Fin. Su base está emplazada en su alojamiento.<p>";
}

//borramos el fichero tabla.sql subido a la ubicación backup

$return unlink($path.$nombre);
//Return FALSE if not found
var_dump($return);
?>
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 04:30.