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