Avatar billede michaeltryl Seniormester
10. maj 2008 - 13:37 Der er 12 kommentarer og
1 løsning

automatisk backup af mysql

Jeg leder efter et script som kan lave en backup af min mysql database og sende indholdet til min mail.
Jeg har styr på at sende indholdet til min mail via phpmailer, men mangler et script som genere et dump af min databse.

Jeg har fundet dette script
http://www.eksperten.dk/spm/319984
men får fejlen
Parse error: syntax error, unexpected '{' in ........ on line 73

linie 73 er det } i denne funktion

functionmy_handler($sql_insert)
{
global$crlf;
echo"$sql_insert;$crlf";
}

er der en her som kan se fejlen eller kender et andet script til at klare det med?
Avatar billede olebole Juniormester
10. maj 2008 - 13:53 #1
<ole>

Måskeduskulleprøvemednoglemellemrumnårdukoder  ;o)

Du bør adskille 'global' fra '$crlf' - og ligeledes i næste linje. Om det er det, der introducerer fejlen, tvivler jeg dog på. Jeg undrer mig mere over, hvad det første semikolon laver i linjen:
    echo"$sql_insert;$crlf";

Kunne det mon ikke være dér, fejlen ligger?

/mvh
</bole>
Avatar billede olebole Juniormester
10. maj 2008 - 14:01 #2
Njah ... det semikolon kunne selvfølgelig være slutningen på en SQL-linje  =)

Jeg tror, du må vise noget mere kode. Godt nok fanges en fejl i linje 73, men den udløsende faktor (den egentlige fejl) ligger vist et andet sted
Avatar billede michaeltryl Seniormester
10. maj 2008 - 14:36 #3
jeg havde fået fjernet lidt for mange mellemrum, da der var problemer med header.
Jeg har fået det til at virke nu, men kan ikke regne ud hvordan jeg får det lagt ud i en fil

jeg har prøvet at ændre
print
til
$indhold .=
for at samle alt skreven indhold til en variabel, men det virker ikke efter hensigten.
alt kode kan ses her
http://www.eksperten.dk/spm/319984
21/02-2003 08:59:47 (1. svar)
Avatar billede michaeltryl Seniormester
10. maj 2008 - 15:03 #4
før udskrev den dumpet på skærmen, men nu kommer den op med en download boks når jeg besøger siden. er der en måde hvorpå den autmatisk gemmer filen på serveren?
Avatar billede michaeltryl Seniormester
10. maj 2008 - 15:09 #5
Jeg fandt en løsning her
http://www.eksperten.dk/spm/433195
Vil du have point så kom med et svar for du hjalp med mellemrums problemet
Avatar billede olebole Juniormester
10. maj 2008 - 15:25 #6
Ellers kunne du prøve:

<?php
   
  $dbhost = "**********";
  $dbuname = "*********";
  $dbpass = "*******";
  $dbname = "********";

  @set_time_limit(600);
  $crlf="\n";

  // Danish Text   
  $strNoTablesFound = "Ingen databasetabeller fundet";
  $strHost = "Host";
  $strDatabase = "Database ";
  $strTableStructure = "Struktur for tabel";
  $strDumpingData = "Indhold af tabel";
  $strError = "Fejl";
  $strSQLQuery = "SQL-query";
  $strMySQLSaid = "MySQL: ";
  $strBack = "Tilbage";
  $strFileName = "DB-dump";
  $strName = "Backup af database";
  $strDone = "Downloadet d.";
  $strat = "kl.";
  $date_jour = date ("d-m-Y");       
 
  // Log name:
  $logName = $strFileName $dbname $date_jour.sql;
 
  header("Content-Disposition: filename=$logName");
  header("Content-Type: text/html");
  header("Pragma: no-cache");
  header("Expires: 0");
       
  // doing some DOS-CRLF magic...
  $client = getenv("HTTP_USER_AGENT");
  if(ereg('[^(]*\((.*)\)[^)]*',$client,$regs))
  {
    $os = $regs[1];
    // this looks better under WinX
    if (eregi("Win",$os))
      $crlf="\r\n";
  }
       
       
  function my_handler($sql_insert)
  {
    global $crlf;
    return "$sql_insert;$crlf";
  }
       
  // Get the content of $table as a series of INSERT statements.
  // After every row, a custom callback function $handler gets called.
  // $handler must accept one parameter ($sql_insert);
  function get_table_content($db, $table, $handler)
  {
    $result = mysql_db_query($db, "SELECT * FROM $table") or mysql_die();
    $i = 0;
    while($row = mysql_fetch_row($result))
    {
      $table_list = "(";
       
      for($j=0; $j<mysql_num_fields($result);$j++)
                    $table_list .= mysql_field_name($result,$j).", ";
       
      $table_list = substr($table_list,0,-2);
      $table_list .= ")";
       
      if(isset($GLOBALS["showcolumns"]))
        $schema_insert = "INSERT INTO $table $table_list VALUES (";
      else
        $schema_insert = "INSERT INTO $table VALUES (";
       
      for($j=0; $j<mysql_num_fields($result);$j++)
      {
        if(!isset($row[$j]))
          $schema_insert .= " NULL,";
        elseif($row[$j] != "")
          $schema_insert .= " '".addslashes($row[$j])."',";
        else
          $schema_insert .= " '',";
      }
      $schema_insert = ereg_replace(",$", "", $schema_insert);
      $schema_insert .= ")";
      $handler(trim($schema_insert));
      $i++;
    }
    return (true);
  }
       
  // Return $table's CREATE definition
  // Returns a string containing the CREATE statement on success
  function get_table_def($db, $table, $crlf)
  {
    $schema_create = "";
    $schema_create .= "DROP TABLE IF EXISTS $table; CREATE TABLE $table ($crlf";
       
    $result = mysql_db_query($db, "SHOW FIELDS FROM $table") or mysql_die();
    while($row = mysql_fetch_array($result))
    {
      $schema_create .= "  $row[Field] $row[Type]";
       
      if(isset($row["Default"]) && (!empty($row["Default"]) || $row["Default"] == "0"))
        $schema_create .= " DEFAULT '$row[Default]'";
      if($row["Null"] != "YES")
        $schema_create .= " NOT NULL";
      if($row["Extra"] != "")
        $schema_create .= " $row[Extra]";
      $schema_create .= ",$crlf";
    }
    $schema_create = ereg_replace(",".$crlf."$", "", $schema_create);
    $result = mysql_db_query($db, "SHOW KEYS FROM $table") or mysql_die();
    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))
    {
      $schema_create .= ",$crlf";
      if($x == "PRIMARY")
        $schema_create .= "  PRIMARY KEY (" . implode($columns, ", ") . ")";
      elseif (substr($x,0,6) == "UNIQUE")
        $schema_create .= "  UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
      else
        $schema_create .= "  KEY $x (" . implode($columns, ", ") . ")";
    }
       
    $schema_create .= "$crlf)";
    return (stripslashes($schema_create));
  }
       
  function mysql_die($error = "")
  {
    echo "<b> $strError </b><p>";
    if(isset($sql_query) && !empty($sql_query))
    {
      echo "$strSQLQuery: <pre>$sql_query</pre><p>";
    }
    if(empty($error))
      echo $strMySQLSaid.mysql_error();
    else
      echo $strMySQLSaid.$error;
    echo "<br><a href=\"java script:history.go(-1)\">$strBack</a>";
    exit;
  }
       
  global $bruger, $dbhost, $dbuname, $dbpass, $dbname;
  mysql_connect($dbhost, $dbuname, $dbpass);
  @mysql_select_db("$dbname") or die ("Kunne ikke forbinde til databasen");
       
  $tables = mysql_list_tables($dbname);
       
  $num_tables = @mysql_numrows($tables);
  if($num_tables == 0)
  {
    echo $strNoTablesFound;
  }
  else
  {
    $i = 0;
    $heure_jour = date ("H:i");
    $sBuffer = "# ========================================================$crlf";
    $sBuffer .= "#$crlf";
    $sBuffer .= "# $strName : $dbname$crlf";
    $sBuffer .= "# $strDone $date_jour $strat $heure_jour $crlf";
    $sBuffer .= "#$crlf";
    $sBuffer .= "# ========================================================$crlf";
    $sBuffer .= "$crlf";
           
    while($i < $num_tables)
    {
      $table = mysql_tablename($tables, $i);
       
      print $crlf;
      $sBuffer .= "# --------------------------------------------------------$crlf";
      $sBuffer .= "#$crlf";
      $sBuffer .= "# $strTableStructure '$table'$crlf";
      $sBuffer .= "#$crlf$crlf";
       
      echo get_table_def($dbname, $table, $crlf).";$crlf$crlf";
               
      $sBuffer .= "#$crlf";
      $sBuffer .= "# $strDumpingData '$table'$crlf";
      $sBuffer .= "#$crlf$crlf";
           
      get_table_content($dbname, $table, "my_handler");
       
      $i++;
    }
   
    // Write log:
    $fp = fopen($logName, "w");
    fwrite($fp, $sBuffer);
    fclose($fp);
  }
       
?>
Avatar billede olebole Juniormester
10. maj 2008 - 15:27 #7
Jeg vil mene, at den så skulle skrive en fil til dig med SQL'en - og ellers udskrive evt. fejl til browseren - men det er selvfølgelig ganske utestet  =)
Avatar billede michaeltryl Seniormester
10. maj 2008 - 16:40 #8
Den tager ikke alt indhold med aller inserts mangler, men tak for forsøget og tak for hjælpen
Avatar billede olebole Juniormester
10. maj 2008 - 20:48 #9
Selvtak - og tak for points  ;o)

Jeg har da også lavet fejl i koden. Prøv med:

  else
  {
    $i = 0;
    $heure_jour = date ("H:i");
    $sBuffer = "# ========================================================$crlf";
    $sBuffer .= "#$crlf";
    $sBuffer .= "# $strName : $dbname$crlf";
    $sBuffer .= "# $strDone $date_jour $strat $heure_jour $crlf";
    $sBuffer .= "#$crlf";
    $sBuffer .= "# ========================================================$crlf";
    $sBuffer .= "$crlf";
           
    while($i < $num_tables)
    {
      $table = mysql_tablename($tables, $i);
       
      $sBuffer .= "$crlf# --------------------------------------------------------$crlf";
      $sBuffer .= "#$crlf";
      $sBuffer .= "# $strTableStructure '$table'$crlf";
      $sBuffer .= "#$crlf$crlf";
       
      $sBuffer .= get_table_def($dbname, $table, $crlf).";$crlf$crlf";
               
      $sBuffer .= "#$crlf";
      $sBuffer .= "# $strDumpingData '$table'$crlf";
      $sBuffer .= "#$crlf$crlf";
           
      get_table_content($dbname, $table, "my_handler");
       
      $i++;
    }
   
    // Write log:
    $fp = fopen($logName, "w");
    fwrite($fp, $sBuffer);
    fclose($fp);
  }
Avatar billede olebole Juniormester
10. maj 2008 - 21:00 #10
- og der var flere fejl. Nu tror jeg, den er der - men stadig utestet  :)

<?php
   
  $dbhost = "**********";
  $dbuname = "*********";
  $dbpass = "*******";
  $dbname = "********";

  @set_time_limit(600);
  $crlf="\n";

  // Danish Text   
  $strNoTablesFound = "Ingen databasetabeller fundet";
  $strHost = "Host";
  $strDatabase = "Database ";
  $strTableStructure = "Struktur for tabel";
  $strDumpingData = "Indhold af tabel";
  $strError = "Fejl";
  $strSQLQuery = "SQL-query";
  $strMySQLSaid = "MySQL: ";
  $strBack = "Tilbage";
  $strFileName = "DB-dump";
  $strName = "Backup af database";
  $strDone = "Downloadet d.";
  $strat = "kl.";
  $date_jour = date ("d-m-Y");       
 
  // Log name:
  $logName = $strFileName $dbname $date_jour.sql;
 
  header("Content-Disposition: filename=$logName");
  header("Content-Type: text/html");
  header("Pragma: no-cache");
  header("Expires: 0");
       
  // doing some DOS-CRLF magic...
  $client = getenv("HTTP_USER_AGENT");
  if(ereg('[^(]*\((.*)\)[^)]*',$client,$regs))
  {
    $os = $regs[1];
    // this looks better under WinX
    if (eregi("Win",$os))
      $crlf="\r\n";
  }
       
  // Get the content of $table as a series of INSERT statements.
  // After every row, a custom callback function $handler gets called.
  // $handler must accept one parameter ($sql_insert);
  function get_table_content($db, $table, $handler)
  {
    global $crlf;
    $result = mysql_db_query($db, "SELECT * FROM $table") or mysql_die();
    $i = 0;
    $sLocBuffer = "";
    while($row = mysql_fetch_row($result))
    {
      $table_list = "(";
       
      for($j=0; $j<mysql_num_fields($result);$j++)
                    $table_list .= mysql_field_name($result,$j).", ";
       
      $table_list = substr($table_list,0,-2);
      $table_list .= ")";
       
      if(isset($GLOBALS["showcolumns"]))
        $schema_insert = "INSERT INTO $table $table_list VALUES (";
      else
        $schema_insert = "INSERT INTO $table VALUES (";
       
      for($j=0; $j<mysql_num_fields($result);$j++)
      {
        if(!isset($row[$j]))
          $schema_insert .= " NULL,";
        elseif($row[$j] != "")
          $schema_insert .= " '".addslashes($row[$j])."',";
        else
          $schema_insert .= " '',";
      }
      $schema_insert = ereg_replace(",$", "", $schema_insert);
      $schema_insert .= ")";
      $sLocBuffer .= trim($schema_insert).$crlf;
      $i++;
    }
    return $sLocBuffer;
  }
       
  // Return $table's CREATE definition
  // Returns a string containing the CREATE statement on success
  function get_table_def($db, $table, $crlf)
  {
    $schema_create = "";
    $schema_create .= "DROP TABLE IF EXISTS $table; CREATE TABLE $table ($crlf";
       
    $result = mysql_db_query($db, "SHOW FIELDS FROM $table") or mysql_die();
    while($row = mysql_fetch_array($result))
    {
      $schema_create .= "  $row[Field] $row[Type]";
       
      if(isset($row["Default"]) && (!empty($row["Default"]) || $row["Default"] == "0"))
        $schema_create .= " DEFAULT '$row[Default]'";
      if($row["Null"] != "YES")
        $schema_create .= " NOT NULL";
      if($row["Extra"] != "")
        $schema_create .= " $row[Extra]";
      $schema_create .= ",$crlf";
    }
    $schema_create = ereg_replace(",".$crlf."$", "", $schema_create);
    $result = mysql_db_query($db, "SHOW KEYS FROM $table") or mysql_die();
    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))
    {
      $schema_create .= ",$crlf";
      if($x == "PRIMARY")
        $schema_create .= "  PRIMARY KEY (" . implode($columns, ", ") . ")";
      elseif (substr($x,0,6) == "UNIQUE")
        $schema_create .= "  UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
      else
        $schema_create .= "  KEY $x (" . implode($columns, ", ") . ")";
    }
       
    $schema_create .= "$crlf)";
    return (stripslashes($schema_create));
  }
       
  function mysql_die($error = "")
  {
    echo "<b> $strError </b><p>";
    if(isset($sql_query) && !empty($sql_query))
    {
      echo "$strSQLQuery: <pre>$sql_query</pre><p>";
    }
    if(empty($error))
      echo $strMySQLSaid.mysql_error();
    else
      echo $strMySQLSaid.$error;
    echo "<br><a href=\"java script:history.go(-1)\">$strBack</a>";
    exit;
  }
       
  global $bruger, $dbhost, $dbuname, $dbpass, $dbname;
  mysql_connect($dbhost, $dbuname, $dbpass);
  @mysql_select_db("$dbname") or die ("Kunne ikke forbinde til databasen");
       
  $tables = mysql_list_tables($dbname);
       
  $num_tables = @mysql_numrows($tables);
  if($num_tables == 0)
  {
    echo $strNoTablesFound;
  }
  else
  {
    $i = 0;
    $heure_jour = date ("H:i");
    $sBuffer = "# ========================================================$crlf";
    $sBuffer .= "#$crlf";
    $sBuffer .= "# $strName : $dbname$crlf";
    $sBuffer .= "# $strDone $date_jour $strat $heure_jour $crlf";
    $sBuffer .= "#$crlf";
    $sBuffer .= "# ========================================================$crlf";
    $sBuffer .= "$crlf";
           
    while($i < $num_tables)
    {
      $table = mysql_tablename($tables, $i);
       
      $sBuffer .= "$crlf# --------------------------------------------------------$crlf";
      $sBuffer .= "#$crlf";
      $sBuffer .= "# $strTableStructure '$table'$crlf";
      $sBuffer .= "#$crlf$crlf";
       
      $sBuffer .= get_table_def($dbname, $table, $crlf).";$crlf$crlf";
               
      $sBuffer .= "#$crlf";
      $sBuffer .= "# $strDumpingData '$table'$crlf";
      $sBuffer .= "#$crlf$crlf";
           
      $sBuffer .= get_table_content($dbname, $table, "my_handler");
       
      $i++;
    }
   
    // Write log:
    $fp = fopen($logName, "w");
    fwrite($fp, $sBuffer);
    fclose($fp);
  }
       
?>
Avatar billede hindbersnitten Nybegynder
11. maj 2008 - 09:08 #11
Kan man lige nå at anbefalde det her.
Har automatisk backup af mysql

Bruger det selv og det virker kanon godt..

http://www.phpmybackuppro.net/
Avatar billede michaeltryl Seniormester
11. maj 2008 - 11:48 #12
der var et par småfejl endnu, men nu virker det.
jeg rettede

$logName = $strFileName $dbname $date_jour.sql;
til
$logName = "$strFileName-$dbname-$date_jour.sql";

og

$schema_insert .= ")";
til
$schema_insert .= ");";
da den ellers ikke generede en korrekt sql

derudover har jeg fjernet
    // Write log:
    $fp = fopen($logName, "w");
    fwrite($fp, $sBuffer);
    fclose($fp);

da phpmailer selv kan lave en fil og sende videre med en mail.
Du skal have tak for hjælpen igen.

hindbersnitten, dit ser også fint ud, men jeg holder mig til ovenstående script, da det du sendte kan en del mere end hvad jeg har brug for
Avatar billede olebole Juniormester
11. maj 2008 - 14:04 #13
Selvtak ... bare det lykkes - one way or the other  ;o)
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