mysqldumping v1.13

8 08 2009

Esta es mi forma de volcar el contenido de una base de datos a un archivo .sql:

<?php
/*	mysqldumping v1.13 by FCR
*	volcar el contenido de una DB a un .sql
*/
if($_POST['defchar']){
	$defchar = $_POST['defchar'];
}
else
{//pone latin1 en DEFAULT CHARACTER SET 
	$defchar = "latin1";
}
$oncreate = $_POST['oc'];
?>

<html>
<head>
<title>mySQLdump v1.13</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>
body{
font-size:17px;
background-color:#EEEEEE;
}
.nbox{
font-size:18px;
background-color:#FFFFFF;
}
.dbox{
font-size:19px;
color:#00FF00;
background-color:#CAE0F0;
}
#formu{
background-color:#CAE0F0;
width:80%;
}
.halfspn{
width:50%;
}
</style>
</head>

<body>
<div id="formu">
<form action="<?php echo $PHP_SELF; ?>" name="datos" method="POST">
<table>
<tr><td class="halfspn">host</td><td class="halfspn"><input type="text" name="host" value="<?php echo $_POST['host']; ?>" class="nbox"></td></tr>
<tr><td class="halfspn">usuario</td><td class="halfspn"><input type="text" name="ucr" value="<?php echo $_POST['ucr']; ?>" class="nbox"></td></tr>
<tr><td class="halfspn">contraseña</td><td class="halfspn"><input type="password" name="pax" value="<?php echo $_POST['pax']; ?>" class="nbox"></td></tr>
<tr><td class="halfspn">Base de Datos</td><td class="halfspn"><input type="text" name="dbn" value="<?php echo $_POST['dbn']; ?>" class="nbox"></td></tr>
<tr>
<td class="halfspn">Al crear...</td>
<td class="halfspn">
<select name='oc'>
<option value="a" <?php if($oncreate=="a") echo "selected"; ?>>no verificar si existe la tabla</option>
<option value="b" <?php if($oncreate=="b") echo "selected"; ?>>verificar si existe la tabla</option>
<option value="c" <?php if($oncreate=="c") echo "selected"; ?>>eliminar la tabla si existe</option>
</select>
</td>
</tr>
<tr><td class="halfspn">Juego de caracteres</td><td class="halfspn"><input type="text" name="defchar" value="<?php echo $defchar; ?>" class="nbox"></td></tr>
</table>
<input type="hidden" name="dump" value="GO!">
<input type="submit"  value="Generar SQL" class="dbox">
</form>
</div>
<?php
if($_POST['dump']){
$hostname = $_POST['host'];
$username = $_POST['ucr'];
$password = $_POST['pax'];
$dbName = $_POST['dbn'];

$fecha = date("d/m/Y h:i");

$link = mysql_connect($hostname,$username,$password) or die("Can't create connection");
if(!$link){echo '<span style="color:RED;">Error al conectar a base de datos.</span>';exit;}
$dblink = mysql_select_db($dbName, $link) or die("Can't connect to database");
if(!$dblink){echo '<span style="color:RED;">Error al conectar a base de datos.</span>';exit;}
if(isset($defchar) && $defchar<>""){@mysql_query("SET NAMES '$defchar'");}

$i=0;$filetodownload=$dbName.'_'.md5(uniqid(time())).'.sql';
$fp = fopen ($filetodownload, "w");

$opt0="-- mySQLdumping v1.13\n";fwrite($fp, $opt0);
$opt0="-- ".$fecha."\n";fwrite($fp, $opt0);
$opt0="CREATE DATABASE `".$dbName."` DEFAULT CHARACTER SET ".$defchar.";\n";fwrite($fp, $opt0);
$opt0="USE `".$dbName."`;\n";fwrite($fp, $opt0);
unset($opt0);
unset($fecha);

$res1 = mysql_query("SHOW TABLES FROM $dbName");
while($row1 = mysql_fetch_array($res1)){//todas las tablas
echo "<br>".$row1[0];//esto no va al dumping

	$res2 = mysql_db_query($dbName, "SHOW CREATE TABLE $row1[0]");
	while($row2 = mysql_fetch_array($res2)){//todos los campos de cada tabla con sus propiedades
		if($oncreate == "c"){//si se quiere borrar una tabla ya existente
			$opt1 = "DROP TABLE IF EXISTS `".$row2[0]."`;\n";
			fwrite($fp, $opt1);unset($opt1);
		}
		$str=$row2[1].";\n";//la creacion de una tabla
		if($oncreate == "b"){
			$str=str_replace("CREATE TABLE", "CREATE TABLE IF NOT EXISTS", $str);
		}
		fwrite($fp, $str);//$row1[0]=$row2[0]=nombre tabla,row2[1]=datos de la tabla 
		$res3 = mysql_query("SHOW FIELDS FROM `$row2[0]`",$link);
		$str2 = "";$numcampostabla=0;
		while($row3 = mysql_fetch_row($res3)) {//$row3[0]=nombre de  campos de la tabla
			$str2=$str2."`".$row3[0]."`,";$numcampostabla++;
		}
		$str2.='+';$str2=str_replace(",+", "", $str2);
		$ins = "INSERT INTO `".$row2[0]."` (".$str2.") VALUES\n";

		//un mysql_query para saber que insertar: "SELECT * FROM $row2[0]";
		$res4 = mysql_query("SELECT * FROM `$row2[0]`",$link);
		$str3 = "";

		while($row4 = mysql_fetch_row($res4)){
		$str3.="(";
			foreach($row4 as $nombre_campo => $valor_campo) {
			if(is_int($nombre_campo)) {//mysql devuelve numericos y cadenas, solo quiero numericos
				if(!ereg ("^[-]?[0-9]+([\.][0-9]+)?$", $valor_campo)){//si no es numero
					$str3=$str3."'".str_replace("'", "%00%", $valor_campo)."',";//antes "`",ahora '
				}
				else
				{
					$str3=$str3."".$valor_campo.",";
				}
			}
			}
			$str3.='+';
			$str3=str_replace(",+", "", $str3)."),\n";
		}
		if($str3<>""){//si las tablas no estan vacias
			$str3.='++';$str3=str_replace(",\n++", ";\n", $str3);
			mysql_free_result($res4);
			fwrite($fp, $ins);
			fwrite($fp, $str3);
		}
		else
		{
		echo " [Tabla vacia]";//este no va al dumping
		}
		echo "<br>Filas:".$numcampostabla;//este no va al dumping
		mysql_free_result($res3);
	}
	mysql_free_result($res2);
}
fclose($fp);
mysql_free_result($res1);
mysql_close();
echo "<br>SQL listo : <a href='".$filetodownload."'>".$filetodownload."</a>";
}
?>

</body>
</html>

Nota: convierto los ‘ en %00% para poder usar los inserts, deben estar enmarcados en algo(que no puede ser `, como en las sentencia de creación de tablas). Sugiero usar en tus scripts str_replace para convertir %00% en ‘ antes de dar echo(y si es posible guardar cualquier ‘ como %00%)

Anuncios

Acciones

Information

One response

1 05 2010
poblarDB v1.11 « Incendia la ciudad

[…] pero luego de mucho tiempo corrigiendo errores creo que ya esta listo:poblarDB.php la inversa de mysqldumping.php (pasar de .sql a la DB en lugar de DB a un […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: