Foros del Web » Programando para Internet » PHP »

Volcar contenido de fichero en BDatos

Estas en el tema de Volcar contenido de fichero en BDatos en el foro de PHP en Foros del Web. Primero que nada necesito ver como puedo salvar el contenido de mi BDatos en un fichero .sql donde el mismo me genere los INSERT y ...
  #1 (permalink)  
Antiguo 16/10/2004, 00:57
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Volcar contenido de fichero en BDatos

Primero que nada necesito ver como puedo salvar el contenido de mi BDatos en un fichero .sql donde el mismo me genere los INSERT y los CREATE necesarios para mantener mi BDatos respaldada cada x tiempo. En las FAQ's vi uno pero ese no me trabaja. Lo otro es que quiero saber como hago para ejecutar el contenido de ese fichero SQL en mi BDatos nuevamente, ya sea copiando el contenido del mismo en un TEXTAREA o subiendo el fichero mediante upload a mi servidor y posteriormente leyendolo.

Salu2
__________________
Ing. Reynier Pérez Mira
  #2 (permalink)  
Antiguo 18/10/2004, 08:21
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
EL tema de "respaldar a X tiempo" .. es decir "ejecutar" ese script.php que hagas que va a generar ese archivo de texto plano con la estrucutra que requieres .. lo deberías hacer bajo un "Cron Job" o "programador de taréas" según el S.O. que use tu servidor (Linux/windows respectivamente). Es en ese "Cron Job" o equivalente donde programas la llamada a tu script.php que hagas a los intervalos que definas. Eso es lo mejor e ideal.

La "restauración" de esos datos (de tu .sql generado o bien pegando el código en tu textarea) tan sólo implica ejecutar esas consultas SQL que has generado en tu archivo: mysql_query() .. eso sí, recuerda que esa función de Mysql sólo ejecuta una instrucción a la vez .. así que si tienes por ejemplo algo tipo:

CREATE table{
};
INSERT .....;
INSERT ....;

cada ; (punto y coma) separa una instrucción SQL .. la cual deberás indentificar de tu archivo para aplicar un mysql_query() con cada una .. Para esto, .. simplemente lee tu archivo hacia un string (con file() + implode() o bien fgets() ) y luego aplica un explode() al caracter separador ; ) .. como eso te generará un array .. lo lees con un bucle foreach() y aplicas a cada pasada del mismo tu mysql_query() ..

Esto sería la alternativa "PHP" puro .. por qué lo ideal es que uses lo que vistes en las FAQs referente al uso de "LOAD ..." de Mysql. Eso es lo más óptimo y rápido .. mucho más que usar toda esa lógica PHP (tal vez tengas hasta problemas con el tiempo de ejecución de tu script . .así que tendrás que user set_time_limit() para darle más tiempo de ejecución al script).

De esto y de lo anterior tienes ya scripts ya hecho para tal fin ... buscalos por sitios como www.phpclasses.org o www.hotscripts.com

Un saludo,
  #3 (permalink)  
Antiguo 19/10/2004, 22:37
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Que fuera FDW sin vos?

Cluster:
Gracias por tu respuesta.
Cita:
EL tema de "respaldar a X tiempo" .. es decir "ejecutar" ese script.php que hagas que va a generar ese archivo de texto plano con la estrucutra que requieres .. lo deberías hacer bajo un "Cron Job" o "programador de taréas" ...
cuando me refería a "x tiempo" lo decía de forma manual, o sea, accediendo a través del Sistema de Administración del Portal.
Cita:
La "restauración" de esos datos (de tu .sql generado o bien pegando el código en tu textarea) tan sólo implica ejecutar esas consultas SQL que has generado en tu archivo: mysql_query() .. eso sí, recuerda que esa función de Mysql sólo ejecuta una instrucción a la vez .. así que si tienes por ejemplo algo tipo:

CREATE table{
};
INSERT .....;
INSERT ....;

cada ; (punto y coma) separa una instrucción SQL .. la cual deberás indentificar de tu archivo para aplicar un mysql_query() con cada una .. Para esto, .. simplemente lee tu archivo hacia un string (con file() + implode() o bien fgets() ) y luego aplica un explode() al caracter separador ; ) .. como eso te generará un array .. lo lees con un bucle foreach() y aplicas a cada pasada del mismo tu mysql_query() ..
de aquí no entendí mucho. Me explico mejor cuando trato de crear un tabla me da algunos errores. El código SQL lo he tomado del fichero .sql que genero al exportar tablas desde el MySQL Front o el EMS MySQL Manager que son los que más uso. Este es un ejemplo de creación de tablas.
Código PHP:
CREATE TABLE `administradores` (
  `
idusrint(6unsigned NOT NULL auto_increment,
  `
nombrevarchar(25NOT NULL default '',
  `
correovarchar(250) default NULL,
  `
loginvarchar(200NOT NULL default '',
  `
passwdtinytext NOT NULL,
  `
leveltinyint(3NOT NULL default '2',
  `
fecha_registrodatetime default NULL,
  `
ultima_visitadatetime default NULL,
  `
sessionidvarchar(255NOT NULL default '',
  `
activotinyint(1NOT NULL default '0',
  
PRIMARY KEY  (`idusr`)
TYPE=MyISAM
lo del file() + implode() o fgets() lo entendi más o menos pero no se como hacer uso del ciclo foreach ya que no he trabajado mucho con el en PHP, ni en C++.
Cita:
De esto y de lo anterior tienes ya scripts ya hecho para tal fin ... buscalos por sitios como www.phpclasses.org o www.hotscripts.com
Esto lo quiero realizar yo para el día de mañana cuando me den un proyecto que deba desarrollar yo al 100% sin hacer uso de cosas ya realizadas entonces no tenga que ponerme a investigar a esas horas como debo hacer las cosas cuando en mi tiempo libre podría haberlo. Creo que fuiste tu mismo el que me dijiste alguna vez "no trates de inventar la rueda cuando ya está inventada, solo trata de hacerle modificaciones o agregarle cosas nuevas" o algo por el estilo. Esto lo tengo muy en cuenta pero me gusta aprender y ya ves que en algo por lo menos he avanzado. Ya no soy aquel que hacía preguntas inútiles de PHP, aunque a veces se me escapa una que otra como la de mover la imagen por ejemplo.

Salu2
__________________
Ing. Reynier Pérez Mira
  #4 (permalink)  
Antiguo 20/10/2004, 06:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Ok, .. pues si quieres hacerlo tu mismo ningún problema, ... empezemos por como crear tu ".sql" con la estructura de tu tabla(s) y volcar los datos de estas tablas pero con estructura SQL (Create table, .. .Insert .. etc) que necesitaras.

Te animas a empezar tu?
Cosas que te harán falta saber:
1) Como obtener el nombre de las tablas de tu BD (bien sea para hacer una cópia de seguridad de toda la BD o incluso para indicar N tablas a "respaldar").
2) Leer la estructura (campos -"fields") de una tabla (con sus propiedades de los campos.
3) Para el volcado de los datos en si: hacer consultas SQL a tu BD de la forma habitual .. sólo que ahora iras creando "strings" (cadenas) con sintax SQL tipo: INSERT INTO tabla (nombre_campo1,nombre_campo2,etc) VALUES ($row['nombre_campo1],....etc ..)
4) Crear archivos de texto plano (funciones fopen() en modo escritura y fwrite() entre otras ...

Por supuesto, el tema se puede simplificar mucho y omitir los pasos 1 y 2 si conoces la estructura de tus tablas a "respaldar" de antemano. Pero .. ya puestos .. podrías hacer un script "genérico" que te servirá para cualquier BD, sólo indicarías la BD o tablas de esta a respaldar. Así te servirá para cualquier proyecto. De hecho como ya te dije todo eso ya está más que reinventado, pero nunca está de más saber como enfrentear un proyecto/problema y resolverlo por uno mismo .. no todo está inventado.

Creo que con estas indicaciones ya tienes por donde empezar a trabajar.

Todo esto lo puedes ir viendo en www.php.net/mysql .. de todo esto tienes funciones para hacerlo y ejemplos en los comentarios de los usuarios.

Un saludo,

Última edición por Cluster; 20/10/2004 a las 06:48
  #5 (permalink)  
Antiguo 20/10/2004, 10:15
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Vamos alla entonces

Voy para ti:
Cita:
Como obtener el nombre de las tablas de tu BD (bien sea para hacer una cópia de seguridad de toda la BD o incluso para indicar N tablas a "respaldar").
He realizado está función para eso y me funciona a la perfección, este es mi archivo config.inc.php que es donde incluyo todas las configuraciones:
Código PHP:
 # config.inc.php
<?php
 $titulo 
"DBase Editor Versión 1.0.0a"
 
$servidor "localhost";
 
$usuario "root"
 
$contrasena "administrator"
 
$persistente 1;
?>
Código PHP:
 # functions.php
 
require_once("config.inc.php");
 function 
BuildDBaseList(){
  global 
$servidor;
  
$dblist mysql_list_dbs();
  echo 
"Bases de Datos ejecutándose en ".$servidor."";
  while(
$result mysql_fetch_object($dblist)){
   
$db $result->Database;
   
$tbl BuildCantTables($db);
  }
 } 
Cita:
Leer la estructura (campos -"fields") de una tabla (con sus propiedades de los campos.
no lo he implementado todavía pero ha de ser con la función mysql_list_fields
(corrígeme si me equivoco).
Cita:
Para el volcado de los datos en si: hacer consultas SQL a tu BD de la forma habitual .. sólo que ahora iras creando "strings" (cadenas) con sintax SQL tipo: INSERT INTO tabla (nombre_campo1,nombre_campo2,etc) VALUES ($row['nombre_campo1],....etc ..)
aquí deberás ayudarme un poco pero creo saber de que me hablas.
Cita:
Crear archivos de texto plano (funciones fopen() en modo escritura y fwrite() entre otras ...
esto lo he hecho otra veces así que no me será díficil hacerlo de nuevo. De hecho en el Portal que estoy creando creo ficheros XML de esta forma.
Tu me dices que es lo que sigue.

Salu2
__________________
Ing. Reynier Pérez Mira
  #6 (permalink)  
Antiguo 20/10/2004, 11:32
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pues .. te faltaría las tablas (nombres de estas) para luego obtener su estructura principalmente .. por qué "normalmente" no creas ".sql" con instrucciones de crear la BD (por qué muchas veces topas con un servicio de hosting que sólo te ofrece una BD de nombre fijo y no puedes crear más .. por ejemplo).

Para listar las tablas que tienes: mysql_list_tables() .. y luego el _fields a esas tablas que obtendrás para ver sus campos y estructura ..

En ese "bucle" que vas a usar para listar esas tablas será donde tendrás que ir viendo ya como dar "forma" a la línea que vas a ir generando en tu archivo de texto plano que vas a crear. Para eso tienes que conocer bien la sintax SQL de creación de una tabla para seguirla y respetarla a la hora de componer esa "cadena" (string) que para el caso es lo que es para PHP en ese punto. (http://dev.mysql.com/doc/mysql/en/CREATE_TABLE.html)

Algo tipo:

Código PHP:
$sql $titulo."\n";
bucle (lee nombre tabla){
   
$sql "CREATE TABLE $nombre_Tabla (";
   
bucle (lee "campos/fields" de la tabla){
     
$sql .= $row['nombre_campo']."...".$row['propiedades'] ... etc;
   }
   
$sql .= "};\n";

Si te fijas .. se trata de ir concatenando en $sql los nombres y propiedades de esos campos para ir formando la sentencia SQL como corresponda.

Algo similar será para el "volcado de datos" generando en su lugar sentencias "INSERT INTO ....." y teniendo en cuenta que el separador de instrucciones SQL es el ;

Para generar el archivo .. usas fopen() ... y fwrite($fp,$slq) ... + los fclose() que corresponden ... (más info: www.php.net/fwrite). Recuerda que el salto de línea para un archivo de texto plano es \n (o \r\n o \r dependiendo del S.O. que lo lea).

Un saludo,

Última edición por Cluster; 20/10/2004 a las 11:33
  #7 (permalink)  
Antiguo 20/10/2004, 12:21
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Mira esto

Esto es lo que he logrado hasta ahora Cluster:
Código PHP:
<?php
 mysql_connect
("localhost","root","administrator");
 
mysql_select_db("oclae");
 
$dbname "oclae";
 
$listtables mysql_list_tables($dbname);
 while (
$tables mysql_fetch_row($listtables)){
  
$sql "CREATE TABLE(".$tables[0].") (";
  
$listfields mysql_list_fields($dbname,$tables[0]);
  
$query "SELECT * FROM ".$tables[0]."";
  
$result mysql_query($query) or die(mysql_error());
  
$columnes mysql_num_fields($listfields);
  echo 
"<strong>".$tables[0]."</strong><br>";
  for(
$i=0$i<$columnes$i++){
   echo 
"Name: ".mysql_field_name($result,$i)." Type: ".mysql_field_type($result,$i)." Lenght: ".mysql_field_len($result,$i)."<br>";
  }
 }
?>
esto me devuelve esto:
Cita:
administradores
Name: idusr Type: int Lenght: 6
Name: nombre Type: string Lenght: 25
Name: correo Type: string Lenght: 250
Name: login Type: string Lenght: 200
Name: passwd Type: blob Lenght: 255
Name: level Type: int Lenght: 3
Name: feadministradores
Name: idusr Type: int Lenght: 6
Name: nombre Type: string Lenght: 25
Name: correo Type: string Lenght: 250
Name: login Type: string Lenght: 200
Name: passwd Type: blob Lenght: 255
Name: level Type: int Lenght: 3
Name: fecha_registro Type: datetime Lenght: 19
Name: ultima_visita Type: datetime Lenght: 19
Name: sessionid Type: string Lenght: 255
Name: activo Type: int Lenght: 1
menu
Name: idmenu Type: int Lenght: 6
Name: idioma Type: int Lenght: 1
Name: titulo Type: string Lenght: 50
Name: span Type: string Lenght: 250
Name: direccion Type: string Lenght: 250
Name: tipo Type: int Lenght: 1
Name: orden Type: int Lenght: 3
Name: activo Type: int Lenght: 1
usuarios
Name: idusr Type: int Lenght: 6
Name: nombre Type: string Lenght: 25
Name: correo Type: string Lenght: 250
Name: login Type: string Lenght: 200
Name: passwd Type: blob Lenght: 255
Name: level Type: int Lenght: 3
Name: fecha_registro Type: datetime Lenght: 19
Name: ultima_visita Type: datetime Lenght: 19
Name: sessionid Type: string Lenght: 255
Name: activo Type: int Lenght: 1
cha_registro Type: datetime Lenght: 19
Name: ultima_visita Type: datetime Lenght: 19
Name: sessionid Type: string Lenght: 255
Name: activo Type: int Lenght: 1
menu
Name: idmenu Type: int Lenght: 6
Name: idioma Type: int Lenght: 1
Name: titulo Type: string Lenght: 50
Name: span Type: string Lenght: 250
Name: direccion Type: string Lenght: 250
Name: tipo Type: int Lenght: 1
Name: orden Type: int Lenght: 3
Name: activo Type: int Lenght: 1
usuarios
Name: idusr Type: int Lenght: 6
Name: nombre Type: string Lenght: 25
Name: correo Type: string Lenght: 250
Name: login Type: string Lenght: 200
Name: passwd Type: blob Lenght: 255
Name: level Type: int Lenght: 3
Name: fecha_registro Type: datetime Lenght: 19
Name: ultima_visita Type: datetime Lenght: 19
Name: sessionid Type: string Lenght: 255
Name: activo Type: int Lenght: 1
pero no se como concatenar la consulta y tampoco se como coger si el campo es NOT NULL, AUTOINCREMENT y esas propiedades específicas.
Salu2
__________________
Ing. Reynier Pérez Mira
  #8 (permalink)  
Antiguo 20/10/2004, 12:40
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Para "concatenar" .. tan sólo respeta la sintax SQL del "CREATE" ...

algo tipo (si quieres usra: mysql_field_name($result,$i) aunque podrías usar $columnes[0] .. $columnes[1] .. etc que corresponden al "nombre" del campo, el "tipo" .. la "logintud" .. etc ...

Código PHP:
$sql .= $columnes[0]." ".$columnes[1]."(".$columnes[1].")".$el_otro_dato.";"
Cita:
pero no se como concatenar la consulta y tampoco se como coger si el campo es NOT NULL, AUTOINCREMENT y esas propiedades específicas
Ahí ya no sé .. (no he investigado más el tema) .. Lo único que puedo comentarte es que hay funciones SQL de la gama: SHOW .. SHOW Tables .. etc .. que creo que puedes obtener más información que la que tal vez entrege PHP con sus mysql_list_.. y demás.

Por lo demás .. podrías investigar el código de phpMyadmin (www.phpmyadmin.net) para ver como trabaja ese tema puntual.

Un saludo,
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 15:20.