Avatar billede dcheng Novice
15. september 2006 - 20:46 Der er 3 kommentarer og
1 løsning

Backup script til .sql

Hej,

Jeg har for langt tid siden hvor jeg ikke kunne ret meget php fanget et script som kunne lave .sql filer.. altså dumpe hele databasen ud... ved blot at angive tabel navnene.. Jeg kunne godt tænke mig at få det modificeret således den henter alle tabeller og data i en given database

Nogen som er interesseret i at hjælpe?

Her er koden:
--------------------------------------------
ini_set("max_execution_time",0);
$dbhost="localhost";
$dbuser="root";
$dbpass="";
$dbname="db";
//Liste over tabeller
$table0="brugere";
$table1="opgaver";
$table2="history";
//Antal tabeller 0 tæller som 1
$numtables="2";
extract($_POST);

$filename = date("Y-m-d");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$filename.sql");
header("Pragma: no-cache");
header("Expires: 0");
//Liste over tabeller
$tables[0] = "brugere";
$tables[1] = "opgaver";
$tables[2] = "history";
flush();
$conn = @mysql_connect($dbhost,$dbuser,$dbpass);
if ($conn==false)  die("password / user or database name wrong");
mysql_select_db($dbname,$conn);

function get_def($dbname, $table) {
    global $conn;
    $def = "";
    $def .= "DROP TABLE IF EXISTS $table;\n";
    $def .= "CREATE TABLE $table (\n";
    $result = mysql_db_query($dbname, "SHOW FIELDS FROM $table",$conn) or die("Table $table not existing in database");
    while($row = mysql_fetch_array($result)) {
        $def .= "    $row[Field] $row[Type]";
        if ($row["Default"] != "") $def .= " DEFAULT '$row[Default]'";
        if ($row["Null"] != "YES") $def .= " NOT NULL";
          if ($row[Extra] != "") $def .= " $row[Extra]";
            $def .= ",\n";
    }
    $def = ereg_replace(",\n$","", $def);
    $result = mysql_db_query($dbname, "SHOW KEYS FROM $table",$conn);
    while($row = mysql_fetch_array($result)) {
          $kname=$row[Key_name];
          if(($kname != "PRIMARY") && ($row[Non_unique] == 0)) $kname="UNIQUE|$kname";
          if(!isset($index[$kname])) $index[$kname] = array();
          $index[$kname][] = $row[Column_name];
    }
    while(list($x, $columns) = @each($index)) {
          $def .= ",\n";
          if($x == "PRIMARY") $def .= "  PRIMARY KEY (" . implode($columns, ", ") . ")";
          else if (substr($x,0,6) == "UNIQUE") $def .= "  UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
          else $def .= "  KEY $x (" . implode($columns, ", ") . ")";
    }

    $def .= "\n);";
    return (stripslashes($def));
}

function get_content($dbname, $table) {
global $filetype, $path;

    global $conn;
    $content="";
    $result = mysql_db_query($dbname, "SELECT * FROM $table",$conn) or die("Cannot get content of table");

    $cnt=0;
    while($row = mysql_fetch_row($result)) {
        $insert = "INSERT INTO $table VALUES (";
        for($j=0; $j<mysql_num_fields($result);$j++) {
            if(!isset($row[$j])) $insert .= "NULL,";
            else if($row[$j] != "") $insert .= "'".addslashes($row[$j])."',";
            else $insert .= "'',";
        }
        $insert  = ereg_replace(",$","",$insert);
        $insert .= ");\n";
        $content.= $insert;
        $cnt++;       
    }
    return $content;
}

$filetype = "sql";

if (!eregi("/restore\.",$PHP_SELF)) {
    $cur_time=date("Y-m-d H:i");
    $i = 0; 
    while($i < $numtables+1) {
              if ($tables[$i] != "") {
            $newfile .= get_def($dbname,$tables[$i]);
            $newfile .= "\n\n";
            if ($structonly!="Yes") {
                $newfile .= get_content($dbname,$tables[$i]);
                $newfile .= "\n\n";
                }         
          }
          $i++;
    }   
}

echo "$content";
echo "$newfile";
Avatar billede dcheng Novice
15. september 2006 - 20:47 #1
Og her er restore funktionen..

Det skal siges jeg ikke har testet den pr. d.d.
Men det har fungeret....

mysql_connect("localhost", "root", "");
mysql_select_db("db");
$sqlfile = $_FILES["sqlfile"]["tmp_name"];
$query = file_get_contents($sqlfile);

$array = explode(";", $query);
$total = count($array);
$total2 = $total - 1;
$nr = 0;
while ( $nr < $total2) {
    if(mysql_query($array[$nr])) {
        echo "<A class=\"green\">Query $nr udført</A><BR>";
        echo "<B>Query:</B><BR>$array[$nr]<BR><BR>";
    } else {
        echo "<A class=\"red\">Query $nr ikke udført</A><BR>";
        echo "<B>Query:</B><BR>$array[$nr]<BR><B>Fejl:</B><BR><BR>";
        echo mysql_error();
    }
    $nr++;
}
Avatar billede ellebaek Nybegynder
15. september 2006 - 21:24 #2
ini_set("max_execution_time",0);
$dbhost="localhost";
$dbuser="root";
$dbpass="";
$dbname="db";
//Liste over tabeller
$table0="brugere";
$table1="opgaver";
$table2="history";
//Antal tabeller 0 tæller som 1
$numtables="2";
extract($_POST);

$filename = date("Y-m-d");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$filename.sql");
header("Pragma: no-cache");
header("Expires: 0");
//Liste over tabeller
$tables[0] = "brugere";
$tables[1] = "opgaver";
$tables[2] = "history";
flush();
$conn = @mysql_connect($dbhost,$dbuser,$dbpass);
if ($conn==false)  die("password / user or database name wrong");
mysql_select_db($dbname,$conn);

function get_def($dbname, $table) {
    global $conn;
    $def = "";
    $def .= "DROP TABLE IF EXISTS $table;\n";
    $def .= "CREATE TABLE $table (\n";
    $result = mysql_db_query($dbname, "SHOW FIELDS FROM $table",$conn) or die("Table $table not existing in database");
    while($row = mysql_fetch_array($result)) {
        $def .= "    $row[Field] $row[Type]";
        if ($row["Default"] != "") $def .= " DEFAULT '$row[Default]'";
        if ($row["Null"] != "YES") $def .= " NOT NULL";
          if ($row[Extra] != "") $def .= " $row[Extra]";
            $def .= ",\n";
    }
    $def = ereg_replace(",\n$","", $def);
    $result = mysql_db_query($dbname, "SHOW KEYS FROM $table",$conn);
    while($row = mysql_fetch_array($result)) {
          $kname=$row[Key_name];
          if(($kname != "PRIMARY") && ($row[Non_unique] == 0)) $kname="UNIQUE|$kname";
          if(!isset($index[$kname])) $index[$kname] = array();
          $index[$kname][] = $row[Column_name];
    }
    while(list($x, $columns) = @each($index)) {
          $def .= ",\n";
          if($x == "PRIMARY") $def .= "  PRIMARY KEY (" . implode($columns, ", ") . ")";
          else if (substr($x,0,6) == "UNIQUE") $def .= "  UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
          else $def .= "  KEY $x (" . implode($columns, ", ") . ")";
    }

    $def .= "\n);";
    return (stripslashes($def));
}

function get_content($dbname, $table) {
global $filetype, $path;

    global $conn;
    $content="";
    $result = mysql_db_query($dbname, "SELECT * FROM $table",$conn) or die("Cannot get content of table");

    $cnt=0;
    while($row = mysql_fetch_row($result)) {
        $insert = "INSERT INTO $table VALUES (";
        for($j=0; $j<mysql_num_fields($result);$j++) {
            if(!isset($row[$j])) $insert .= "NULL,";
            else if($row[$j] != "") $insert .= "'".addslashes($row[$j])."',";
            else $insert .= "'',";
        }
        $insert  = ereg_replace(",$","",$insert);
        $insert .= ");\n";
        $content.= $insert;
        $cnt++;     
    }
    return $content;
}

$filetype = "sql";

if (!eregi("/restore\.",$PHP_SELF)) {
    $cur_time=date("Y-m-d H:i");
    $i = 0;
$query = "SHOW TABLES FROM $dbname";
$result = mysql_db_query($dbname, $query, $conn)

    while($row = mysql_fetch_array($result)) {
              if ($row[0] != "") {
            $newfile .= get_def($dbname,$row[0]);
            $newfile .= "\n\n";
            if ($structonly!="Yes") {
                $newfile .= get_content($dbname,$row[0]);
                $newfile .= "\n\n";
                }       
          }
          $i++;
    } 
}

echo "$content";
echo "$newfile";

tror måske det her kan klare det for dig.. det burde finde alle tabeller i databasen, og så løbe dem igennem en af gangen...
Avatar billede dcheng Novice
15. september 2006 - 21:45 #3
Dette er den endelige version efter at have rettet nogle små fejl


Smid svar så du kan få nogle point :P Mange tak!

----------------

<?
ini_set("max_execution_time",0);
$dbhost="localhost";
$dbuser="root";
$dbpass="";
$dbname="dv";
$structonly = NULL;
$content = NULL;
$numtables="2";
extract($_POST);

$filename = date("Y-m-d");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$filename.sql");
header("Pragma: no-cache");
header("Expires: 0");
flush();
$conn = @mysql_connect($dbhost,$dbuser,$dbpass);
if ($conn==false)  die("password / user or database name wrong");
mysql_select_db($dbname,$conn);

function get_def($dbname, $table) {
    global $conn;
    $def = "";
    $def .= "DROP TABLE IF EXISTS $table;\n";
    $def .= "CREATE TABLE $table (\n";
    $result = mysql_db_query($dbname, "SHOW FIELDS FROM $table",$conn) or die("Table $table not existing in database");
    while($row = mysql_fetch_array($result)) {
        $def .= "    $row[Field] $row[Type]";
        if ($row["Default"] != "") $def .= " DEFAULT '$row[Default]'";
        if ($row["Null"] != "YES") $def .= " NOT NULL";
          if ($row["Extra"] != "") $def .= " $row[Extra]";
            $def .= ",\n";
    }
    $def = ereg_replace(",\n$","", $def);
    $result = mysql_db_query($dbname, "SHOW KEYS FROM $table",$conn);
    while($row = mysql_fetch_array($result)) {
          $kname=$row["Key_name"];
          if(($kname != "PRIMARY") && ($row["Non_unique"] == 0)) $kname="UNIQUE|$kname";
          if(!isset($index[$kname])) $index[$kname] = array();
          $index[$kname][] = $row["Column_name"];
    }
    while(list($x, $columns) = @each($index)) {
          $def .= ",\n";
          if($x == "PRIMARY") $def .= "  PRIMARY KEY (" . implode($columns, ", ") . ")";
          else if (substr($x,0,6) == "UNIQUE") $def .= "  UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
          else $def .= "  KEY $x (" . implode($columns, ", ") . ")";
    }

    $def .= "\n);";
    return (stripslashes($def));
}

function get_content($dbname, $table) {
global $filetype, $path;

    global $conn;
    $content="";
    $result = mysql_db_query($dbname, "SELECT * FROM $table",$conn) or die("Cannot get content of table");

    $cnt=0;
    while($row = mysql_fetch_row($result)) {
        $insert = "INSERT INTO $table VALUES (";
        for($j=0; $j<mysql_num_fields($result);$j++) {
            if(!isset($row[$j])) $insert .= "NULL,";
            else if($row[$j] != "") $insert .= "'".addslashes($row[$j])."',";
            else $insert .= "'',";
        }
        $insert  = ereg_replace(",$","",$insert);
        $insert .= ");\n";
        $content.= $insert;
        $cnt++;     
    }
    return $content;
}

$filetype = "sql";

if (!eregi("/restore\.",$_SERVER['PHP_SELF'])) {
    $cur_time=date("Y-m-d H:i");
    $i = 0;
$query = "SHOW TABLES FROM $dbname";
$result = mysql_db_query($dbname, $query, $conn);
$newfile = NULL;
    while($row = mysql_fetch_array($result)) {
          if ($row[0] != "") {
            $newfile .= get_def($dbname,$row[0]);
            $newfile .= "\n\n";
            if ($structonly!="Yes") {
                $newfile .= get_content($dbname,$row[0]);
                $newfile .= "\n\n";
                }       
          }
          $i++;
    } 
}
echo "$content";
echo "$newfile";
?>
Avatar billede ellebaek Nybegynder
15. september 2006 - 22:00 #4
hehe... anytime...

Her er et svar :-)
Super du fik det til at funge.

Mvh. jens
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester