Avatar billede mtrolle Nybegynder
06. januar 2004 - 15:53 Der er 10 kommentarer og
1 løsning

backup fil som i phpMyAdmin

Hey!

Jeg siddet og roder lidt med mine system og leget lidt i phpMyAdmin, da jeg ser man kan lave backup af sine database til en fil i phpMyAdmin.
En lignende funktion kunne jeg godt tænke mig at lave selv.
Altså, jeg skal kunne trykke på et link og wupti, en fil er klar til download! Hvordan gøres dette, altså hvordan laver man den fil og skriver til den og derefter åbner den til download?
Jeg kan godt regne PHP'en ud til, hvordan min mysql-kode skrives i filen - men hvordan man skriver i en fil osv. har jeg aldrig leget med!

//mtrolle
ww.phphelp.dk
Avatar billede tefcke Nybegynder
06. januar 2004 - 16:43 #1
Har er en dump funktion jeg laved for et pænt stykke tid siden, den bruger phpmyadmins kode til at dumpe (men jeg har skrevet en kommentar om hvor den kommer fra ;-).
Funktionen bruger 3 globale variabler
1) $DB_NAME - navnet på databasen
2) $DB_BACKUP_DIR - hvor dump filen skal gemmes
3) $DB_BACKUP - true/false - fortæller om der skal laves backup

Der hvor du vil dumpe fra, kalder du bare: db_dump();

/* Function to make a database dump to file */
function db_dump()
{
  global $DB_NAME, $DB_BACKUP_DIR, $DB_BACKUP;
  if ($DB_BACKUP) {
    // Write to file
    $filename = date("Y.m.d.H.i.s").".sql";
    /* Do the header */
    $today = date("l jS \o\f F, H:i:s (@B)");
    $white_space = str_repeat(" ", (54 - strlen($today)));
    $content = "";
    $content .= "#############################################################\n";
    $content .= "#                                                          #\n";
    $content .= "#    THIS FILE WAS AUTOMATICALLY GENERATED ON:            #\n";
    $content .= "#    ".$today.$white_space."#\n";
    $content .= "#                                                          #\n";
    $content .= "#    DENNE FIL INDEHOLDER ET DATABASE DUMP FRA            #\n";
    $content .= "#    DATABASEN $DB_NAME.                                  #\n";
    $content .= "#                                                          #\n";
    $content .= "#    POWERED BY - PHP & MYSQL                              #\n";
    $content .= "#                                                          #\n";
    $content .= "#    © RASMUS PEDERSEN (tefcke@diku.dk)                    #\n";
    $content .= "#                                                          #\n";
    $content .= "#############################################################\n";

    $result = mysql_list_tables($DB_NAME);
    while ($table = mysql_fetch_row($result)) {
      // Get table fields and properties
      $table_info = MySQLGetQuery("
        SHOW FIELDS FROM ".$table[0]);
      foreach ($table_info as $row) {
        // Create a printable string
        $row_array[] = $row['Field']." ".strtoupper($row['Type']).($row['Null']=="" ? " NOT NULL" : "");
        $table_fields[] = $row['Field'];
        // Catch the primary key(s)
        if (strtolower($row['Key'])=="pri") {
          $row_key[] = $row['Field'];
        }
      }
      // Get the table type
      $table_type = MySQLGetQuery("
        SHOW TABLE STATUS LIKE '".$table[0]."'");

      /*
      * Get table data
      */
      $table_data = mysql_query("
        SELECT *
        FROM ".$table[0]);
      // Format table data

      /*
      * The following piece of code is has been customiced for
      * my needs. It's made by staybyte, and orginates from
      * the project phpMyAdmin (http://www.phpMyAdmin.net)
      */
      if ($table_data != FALSE) {
        $fields_cnt = mysql_num_fields($table_data);
        $rows_cnt  = mysql_num_rows($table_data);
        // Checks whether the field is an integer or not
        for ($j = 0; $j < $fields_cnt; $j++) {
          $field_set[$j] = mysql_field_name($table_data, $j);
          $type          = mysql_field_type($table_data, $j);
          if ($type == "tinyint" || $type == "smallint" || $type == "mediumint" || $type == "int" || $type == "bigint"  ||$type == "timestamp") {
            $field_num[$j] = TRUE;
          } else {
            $field_num[$j] = FALSE;
          }
        } // end for
        $search      = array("\x00", "\x0a", "\x0d", "\x1a"); //\x08\\x09, not required
        $replace      = array("\0", "\n", "\r", "\Z");
        $current_row  = 0;
        @set_time_limit($GLOBALS['cfgExecTimeLimit']);
        while ($row = mysql_fetch_row($table_data)) {
          $current_row++;
          for ($j = 0; $j < $fields_cnt; $j++) {
            if (!isset($row[$j])) {
              $values[] = "NULL";
            } else if ($row[$j] == "0" || $row[$j] != "") {
              // a number
              if ($field_num[$j]) {
                $values[] = $row[$j];
              }
              // a string
              else {
                $values[] = "'" . str_replace($search, $replace, sql_add_slashes($row[$j])) . "'";
              }
            } else {
              $values[]    = "''";
            } // end if
          } // end for
          // Extended inserts case
          $insert_line[] = "(".implode(", ", $values).")";
          unset($values);
        } // end while
      } // end if ($result != FALSE)

      /* Append table definitions and data dump */
    $content .= "\n\n-- Struktur dump for tabellen "
            .  $table[0]
            .  "\nDROP TABLE IF EXISTS "
            .  $table[0]
            .  ";\nCREATE TABLE "
            .  $table[0]
            .  " (\n  "
            .  implode(",\n  ", $row_array)
            .  ",\n  PRIMARY KEY ("
            .  implode(", ", $row_key)
            .  ")\n) TYPE="
            .  $table_type[0]['Type']
            .  ";\n\n-- Data dump for tabllen "
            .  $table[0]
            .  "\nINSERT INTO "
            .  $table[0]
            .  " ("
            .  implode(", ", $table_fields)
            .  ")\nVALUES\n"
            .  implode(",\n", $insert_line)
            .  ";\n";
      unset($row_array, $row_key, $table_fields, $insert_line);
    }

    /* Write $content to file */
    cleanup();
    if (is_dir($DB_BACKUP_DIR)) {
      $temp = tempnam($DB_BACKUP_DIR."/", "");
      if (!copy($temp, $DB_BACKUP_DIR."/".$filename)) {
        ;//error_handle("Kunne ikke kopierer filen: <b>$temp</b> til <b>$filename</b>");
      }
      if (!file_exists($DB_BACKUP_DIR."/".$filename)) {
        error_handle("Filen: ".$DB_BACKUP_DIR."/".$filename." findes ikke"); //print("Filen eksister ikke")
      } else {
        $fp = fopen($DB_BACKUP_DIR."/".$filename, "w+");
        if ($fp) {
          fwrite ($fp, $content);
          fclose($fp);
        } // end if
      }// end else
    } else {
      ;//error_handle("$DB_BACKUP_DIR er ikke et bibliotek!"); //print("Ikke et dir!")
    }

  }
} // end function
Avatar billede tefcke Nybegynder
06. januar 2004 - 16:54 #2
Skal måske lige bruge denne funktion før det virker ;)
/* Function to add escape slashes to sql */
function sql_add_slashes($a_string = '')
{
  $a_string = str_replace('\\', '\\\\', $a_string);
  $a_string = str_replace('\'', '\\\'', $a_string);
  return $a_string;
}
Avatar billede mtrolle Nybegynder
06. januar 2004 - 17:17 #3
Hej igen!
Meget kode for, øhh, så lidt ;)
Anyway - det virker ikke - der står Parse error for første linje i funktionen, nemlig global bla bla - hvad betyder global? Jeg kunne forestille mig jeg skal angive noget først!
Avatar billede tefcke Nybegynder
06. januar 2004 - 18:12 #4
global ...
Betyder at variablerne ikke eksisterer inden for funktionen, men derimod uden for funktionen. Ved at skrive gloabal $var; fortæller jeg at den godt må bruge variablen $var inden i funktionen.
Du skal bare sætte variablerne $DB_NAME, $DB_BACKUP_DIR, $DB_BACKUP uden for funktionen f.eks.:
$DB_NAME = ''; // Navnet på databasen
$DB_BACKUP_DIR = 'mysql/backup'; // HUSK at den tager fra der fil hvor funktionen ligger
$DB_BACKUP = true;
Avatar billede mtrolle Nybegynder
06. januar 2004 - 21:03 #5
Den giver stadig parse, også selvom jeg ikke skriver noget forinden dit script :(
Avatar billede tefcke Nybegynder
06. januar 2004 - 21:26 #6
Du skal netop skrive noget ...
Følgende skal skrives før du kalder funktionen:
// Navnet på databasen du vil lave backup af
$DB_NAME = 'mtrolle';
// Det directory hvor filen skal placeres
$DB_BACKUP_DIR = 'mysql/backup';
// true hvis der skal tages backup, false hvis der ikke skal
$DB_BACKUP = true;
Avatar billede mtrolle Nybegynder
06. januar 2004 - 22:07 #7
ja ja - det har jeg skam også prøvet - uden held!
Avatar billede mtrolle Nybegynder
07. januar 2004 - 12:09 #8
kan du evt. give mig den som sphp fil eller .zip, det kan evt. være noget med mellemrum osv. det går i kage her på exp.dk
Avatar billede tefcke Nybegynder
07. januar 2004 - 12:21 #9
Har lige fundet ud af hvor meget denne funktion egentlig afhænger af andre funktioner :)
Der skal faktiske også bruges min egen mysql funktion:
function MySQLGetQuery($query)
{
  $resultat = mysql_query($query);
  if(!$resultat) {
    PrintError("Kunne ikke udføre: <em>$query</em>");
  }

  while($raekke = mysql_fetch_array($resultat)) {
    $resultat_array[] = $raekke;
  }

  return $resultat_array;
}

Nu du tager de 3 funktioner (db_dump(), MySQLGetQuery() og sql_add_slashes()) jeg har vist dig her, og smider dem ind i en fil (evt. functions.php). I den fil hvor du vil lave et backup af databasen, skriver du:
<?php
include('functions.php');
$DB_NAME = 'mtrolle';
$DB_BACKUP_DIR = 'mysql/backup';
$DB_BACKUP = true;
db_dump();
?>

Vær opmærksom på, at du skal have åbnet en database forbindelse inden du kalder funktionen db_dump()!
Det er sådan set det!
Avatar billede mtrolle Nybegynder
07. januar 2004 - 12:28 #10
jeg kunne godt se der manglede en funktion i koden ;)

Men sørgeligt nok, så tror jeg altså det ikke virker, fordi det har været igennem exp.dk, for lige meget hvilken af dine funktioner jeg indsætter først i filen, så melder den fejl i linjen lige efter function (bla) {
Jeg prøvede så i den sidst tilkomne function du har givet mig, at erstatte mellemrum med tabs i de først 4 linjer i funktion, hvorefter parse_error'en skiftede linje nummer. Ergo virker functionerne ikke pga. de mellemrum exp.dk laver!
Avatar billede mtrolle Nybegynder
07. januar 2004 - 22:11 #11
Jeg fandt svar her på exp.dk i et andet spørgsmål...
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