Ver Mensaje Individual
  #5 (permalink)  
Antiguo 09/08/2005, 16:42
Avatar de claudiovega
claudiovega
 
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 5 meses
Puntos: 11
Deficiencias:

1) se siente bien hacer el codigo, pero uno se pregunta si será eficiente cuando los datos crezcan y crezcan
2) en mi codigo los nombres de las tablas quedan con ese signo feo (´) lo cual en algunas versiones parece no funcionar, asi que antes de cargar un respaldo debo limpiar esos caracteres.
3) tambien en versiones mas recientes "show create table" agrega a final el tipo de caracter usado para la tabla, versiones anteriores no lo soportan.

Bueno esas veo yo.

La explicacion va en los comentarios del codigo:

Código PHP:
<?php
   
//aqui falta configurar la conexion a la bd
   
$con_base=mysql_connect("servidor","usuario","password");

   
//saco todas las tablas de la base elegida
   
$tablas=mysql_query("show tables from base;",$con_base);

   
//en general voy concatenando todos los comandos sql
   //en una variable llamado $texto

   //concateno el codigo para crear la base de datos
   
$texto ="create database if not exists base;\n";
   
//concateno el codigo para elegir la base de datos
   
$texto.="use base;\n";
   
//empiezo a recorrer la lista de tablas
   
while($tabla=mysql_fetch_array($tablas))
   {
      
//cojo una tabla
      
$mitabla=$tabla[0];
      
//concateno el codigo para borrar esa tabla si existe
      
$texto.="drop table if exists base.".$mitabla.";\n";
      
//obtengo el codigo para crear la tabla
      
$creates=mysql_query("show create table base.$mitabla;",$con_base);
      while(
$create=mysql_fetch_array($creates))
      {
         
//concateno el codigo de creacion
         
$texto.=$create[1].";\n";
         
//selecciono todos los campos de la tabla que estoy respaldando
         
$datos=mysql_query("select * from base.$mitabla;",$con_base);
         
$campos=mysql_num_fields($datos);
         
$regs=mysql_num_rows($datos);
         for(
$i=0;$i<$regs;$i++)
         {
            
//creo los insert a partir de los registros
            
$inserta="insert into base.$mitabla(";
            for(
$j=0;$j<$campos;$j++)
            {
               
//concateno el nombre de cada campo
               
$nombre=mysql_field_name($datos,$j);
               
$inserta.="$nombre,";
            }
            
$inserta=substr($inserta,0,strlen($inserta)-1).") values(";
            for(
$j=0;$j<$campos;$j++)
            {
               
//concateno los valores de los campos
               
$tipo=mysql_field_type($datos,$j);
               
$valor=mysql_result($datos,$i,$j);
               
//aqui identifico el tipo de dato y agrego comillas simples
               //a los valores de algunos tipos
               
switch($tipo)
               {
                  case 
"string":
                  case 
"date":
                  case 
"time":
                     
$valor="'$valor'";
                     break;
               }
               
$inserta.="$valor,";
            }
            
$inserta=substr($inserta,0,strlen($inserta)-1).");";
            
//concateno los insert a la variable $texto que contiene todo
            
$texto.=$inserta."\n";
         }
      }
      
$texto.="\n";
   }
   
//creo un nombre de archivo con el nombre de la base mas la fecha
   
$archivo"base-".date("d-n-Y").".txt";
   
//pongo el archivo para descarga
   
header("Content-disposition: attachment;filename=$archivo");
   
header("Content-Type: text/plain");
   echo 
$texto;
?>