Primeiramente gostaria de agradecer ao usuário Fabyo do Fórum mysql por postar este maravilhoso script que salva a nossa vida em certas horas. =]
Bom, vamos ao codigo.
Backup.php
<?php
mysql_connect("localhost", "usuario", "senha"); // Troque o usuario pelo login que dá acesso ao mysql, e a senha pela respectiva senha do mysql.
mysql_select_db("banco"); // Troque o banco pelo nome do banco de dados que você quer baixar.
set_time_limit(0);
function sqlAddslashes($str = '', $is_like = FALSE)
{
if ($is_like)
{
$str = str_replace('\\', '\\\\\\\\', $str);
}else{
$str = str_replace('\\', '\\\\', $str);
}
$str = str_replace('\'', '\\\'', $str);
return $str;
}
function dumptb($table) {
$nline = "\n";
$dp = "CREATE TABLE $table ($nline";
$firstfield = 1;
$fields_array = mysql_query("SHOW FIELDS FROM $table");
while ($field = mysql_fetch_array($fields_array))
{
if (!$firstfield)
{
$dp .= ",\n";
}else{
$firstfield = 0;
}
$dp .= "\t".$field["Field"]." ". $field["Type"];
if (isset($field['Default']) && $field['Default'] != '')
{
$dp .= ' default \'' . sqlAddslashes($field['Default']) . '\'';
}
if ($field['Null'] != 'YES')
{
$dp .= ' NOT NULL ';
}
if (!empty($field["Extra"]))
{
$dp .= $field["Extra"];
}
}
mysql_free_result($fields_array);
$keysindex_array = mysql_query("SHOW KEYS FROM $table");
while ($key = mysql_fetch_array($keysindex_array))
{
$kname = $key['Key_name'];
if ($kname != "PRIMARY" and $key['Non_unique'] == 0)
{
$kname = "UNIQUE|$kname";
}
$index[$kname][] = $key['Column_name'];
}
mysql_free_result($keysindex_array);
while(list($kname, $columns) = @each($index))
{
$dp .= ",\n";
$colnames = implode($columns,",");
if($kname == 'PRIMARY')
{
$dp .= "\tPRIMARY KEY ($colnames)";
}else{
if (substr($kname,0,6) == 'UNIQUE')
{
$kname = substr($kname,7);
}
$dp .= " KEY $kname ($colnames)";
}
}
$dp .= "\n);\n\n";
$rows = mysql_query("SELECT * FROM $table");
$numfields=mysql_num_fields($rows);
while ($row = mysql_fetch_array($rows))
{
$dp .= "INSERT INTO $table VALUES(";
$fieldcounter=-1;
$firstfield=1;
while (++$fieldcounter<$numfields)
{
if(!$firstfield)
{
$dp .=' , ';
}else{
$firstfield=0;
}
if (!isset($row[$fieldcounter]))
{
$dp .= 'NULL';
}else{
$dp .= "'".mysql_escape_string($row[$fieldcounter])."'";
}
}
$dp .= ");\n";
}
mysql_free_result($rows);
return $dp;
}
$file_name = date("d-m-Y").".txt";
$filehandle = fopen($file_name,'w');
$result = mysql_query("SHOW tables");
while ($row = mysql_fetch_array($result))
{
fwrite($filehandle,dumptb($row[0])."\n\n\n");
}
fclose($filehandle);
require("zip_lib.php");
$zipfile = new zipfile(date("d-m-Y").".zip");
$zipfile->addFileAndRead($file_name);
echo $zipfile->file();
?>
zip_lib.php
<?php
class zipfile{
var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
function zipfile ($output_filename = 'archive.zip'){
header('Content-Type: application/x-zip');
header('Content-Disposition: inline; filename="' . $output_filename . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
}
function read_File ($file){
if (is_file($file)){
$fp = fopen ($file, 'rb');
$content = fread ($fp, filesize($file));
fclose ($fp);
return $content;
}
}
function addFileAndRead ($file){
if (is_file($file))
$this -> addFile($this -> read_File($file), $file);
}
function unix2DosTime($unixtime = 0){
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
if ($timearray['year'] < 1980){
$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['minutes'] = 0;
$timearray['seconds'] = 0;
}
return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
}
function addFile($data, $name, $time = 0){
$name = str_replace('\\', '/', $name);
$dtime = dechex($this -> unix2DosTime($time));
$hexdtime = '\x' . $dtime[6] . $dtime[7]
. '\x' . $dtime[4] . $dtime[5]
. '\x' . $dtime[2] . $dtime[3]
. '\x' . $dtime[0] . $dtime[1];
eval('$hexdtime = "' . $hexdtime . '";');
$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x08\x00"; // compression method
$fr .= $hexdtime; // last mod time and date
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$fr .= pack('v', strlen($name)); // length of filename
$fr .= pack('v', 0); // extra field length
$fr .= $name;
$fr .= $zdata;
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$this -> datasec[] = $fr;
$new_offset = strlen(implode('', $this -> datasec));
$cdrec = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00"; // version made by
$cdrec .= "\x14\x00"; // version needed to extract
$cdrec .= "\x00\x00"; // gen purpose bit flag
$cdrec .= "\x08\x00"; // compression method
$cdrec .= $hexdtime; // last mod time & date
$cdrec .= pack('V', $crc); // crc32
$cdrec .= pack('V', $c_len); // compressed filesize
$cdrec .= pack('V', $unc_len); // uncompressed filesize
$cdrec .= pack('v', strlen($name)); // length of filename
$cdrec .= pack('v', 0); // extra field length
$cdrec .= pack('v', 0); // file comment length
$cdrec .= pack('v', 0); // disk number start
$cdrec .= pack('v', 0); // internal file attributes
$cdrec .= pack('V', 32); // external file attributes - 'archive' bit set
$cdrec .= pack('V', $this -> old_offset); // relative offset of local header
$this -> old_offset = $new_offset;
$cdrec .= $name;
$this -> ctrl_dir[] = $cdrec;
}
function file(){
$data = implode(NULL, $this -> datasec);
$ctrldir = implode(NULL, $this -> ctrl_dir);
return $data .
$ctrldir .
$this -> eof_ctrl_dir .
pack('v', sizeof($this -> ctrl_dir)) . pack('v', sizeof($this -> ctrl_dir)) . pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00"; // .zip file comment length
}
}
?>
Estudem php crianças, ele pode salvar vidas. =]
nao se engana nao magrinho
o cara era um nulo e pelo jeito sempre vai ser
a classe de zip nao e dele e ele nem toca no assunto do outor
podia se integrar ela no script principal assim a aplicaçao seria standalone
o script nao vai funcionar em todos servidores porque um recurso de connexao ao sevidor mysql nao e global
assim nem sempre vai passar dentre de uma funçao
rog