Avatar billede cvpcvp Nybegynder
06. februar 2004 - 17:21 Der er 9 kommentarer og
2 løsninger

problemmer med DB backup af mysql database fra php

Jeg vil gerne lave backup af min database og fandt noget kode her på eksperten.

det følgende:

<?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");       
 
   
  header("Content-disposition: filename=$strFileName $dbname $date_jour.sql");
  header("Content-type: application/ms-download");
  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;
    echo "$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");
    print "# ========================================================$crlf";
    print "#$crlf";
    print "# $strName : $dbname$crlf";
    print "# $strDone $date_jour $strat $heure_jour $crlf";
    print "#$crlf";
    print "# ========================================================$crlf";
    print "$crlf";
           
    while($i < $num_tables)
    {
      $table = mysql_tablename($tables, $i);
       
      print $crlf;
      print "# --------------------------------------------------------$crlf";
      print "#$crlf";
      print "# $strTableStructure '$table'$crlf";
      print "#$crlf";
      print $crlf;
       
      echo get_table_def($dbname, $table, $crlf).";$crlf$crlf";
               
      print "#$crlf";
      print "# $strDumpingData '$table'$crlf";
      print "#$crlf";
      print $crlf;
           
      get_table_content($dbname, $table, "my_handler");
       
      $i++;
    }
  }
       
?>

mit problem er at det ikke er alle og enhver der skal kunne lave denne backup og der er derfor noget login check inden dette bliver udført. og der gør at jeg får følgende fejl:

Warning: Cannot modify header information - headers already sent by (output started at c:\php\pear\config.php:89) in c:\php\pear\backupInc.php on line 28

er der en vej uden om det problem uden at skulle rette i det forgående jeg har lavet?
Kan det måske laves på en anden måde hvor jeg ikke behøver at ændre header information?
Avatar billede googolplex Novice
06. februar 2004 - 17:57 #1
Indsæt følgende i starten af din side:

<?php ob_start(); ?>

I slutningen:

<?php ob_end_flush(); ?>
Avatar billede avminarm Juniormester
07. februar 2004 - 15:21 #2
det er fordi du har outpot før selve scriptet, lad være med at bruge filen som en include-fil, men kald den via et link og kør den seperart.
Avatar billede cvpcvp Nybegynder
08. februar 2004 - 17:14 #3
det virker ikke googolplex....
og ja avminarm... det er jeg godt klar over... mit spørgsmål var hvordan jeg kunne omgå det...
Jeg kan desværre ikke kalde det som et link. så kan jeg ikke tjekke om vedkommende er logget in.
Avatar billede avminarm Juniormester
09. februar 2004 - 12:11 #4
hvad bruger du ved login? sessions?? fordi så skal ob_start stå FØR din session - sådan:
<?php
ob_start();
session_register();
//script her
?>
Avatar billede avminarm Juniormester
09. februar 2004 - 12:12 #5
og du kan da sagtens tjekke om vedkommende er logget ind, bare lav tjekket inde filen kaldes?
Avatar billede cvpcvp Nybegynder
14. februar 2004 - 15:34 #6
jeg kan stadig ikke få det til at virke!

jeg har prøvet at flytte frem og tilbage på de der ob_start(); og ob_end_flush();
men jeg syntes ikke at jeg kan få det til at virke.

strukturen i mit system er som følger:

backup.php indeholder følgende:

<?php
require("config.php");
if (loggedIn() && isAdmin() )
    include("backupInc.php");
?>

det er i filen config.php at jeg starter en session og det er her funktionerne loggedIn og isAdmin ligger.
det er så i filen backupInc.php at alt koden til backup ligger. jeg får stadig følgende fejl:

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at C:\webpage\backup.php:2) in c:\php\pear\config.php on line 85

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\webpage\backup.php:2) in c:\php\pear\config.php on line 85
Avatar billede googolplex Novice
15. februar 2004 - 02:48 #7
Har du lagt ob_start() som det absolut første på siden ?
Avatar billede avminarm Juniormester
16. februar 2004 - 08:59 #8
har du prøvet:

<?php
ob_start();
require("config.php");
if (loggedIn() && isAdmin() )
    include("backupInc.php");
ob_end_flush();
?>
Avatar billede cvpcvp Nybegynder
17. februar 2004 - 16:56 #9
hvis jeg gør ovenstående får jeg følgende fejl...

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at C:\webpage\backup.php:2) in c:\php\pear\config.php on line 83

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\webpage\backup.php:2) in c:\php\pear\config.php on line 83

Notice: Undefined index: op in c:\php\pear\config.php on line 89

Notice: Undefined index: op in c:\php\pear\config.php on line 113

Warning: Cannot modify header information - headers already sent by (output started at C:\webpage\backup.php:2) in c:\php\pear\backupInc.php on line 28

Warning: Cannot modify header information - headers already sent by (output started at C:\webpage\backup.php:2) in c:\php\pear\backupInc.php on line 29

Warning: Cannot modify header information - headers already sent by (output started at C:\webpage\backup.php:2) in c:\php\pear\backupInc.php on line 30

Warning: Cannot modify header information - headers already sent by (output started at C:\webpage\backup.php:2) in c:\php\pear\backupInc.php on line 31
Avatar billede cvpcvp Nybegynder
17. februar 2004 - 17:00 #10
jeg har fået det til at virke nu..... endelig... med følgende:

<?php
ob_start();
require("config.php");
if (loggedIn() && isAdmin() )
    include("backupInc.php");
ob_end_flush();
?>

det viste sig at jeg havde en enkelt linies mellemrum i starten af filen det kunne den åbenbart ikke li'.
men jeg takker!!
Avatar billede googolplex Novice
17. februar 2004 - 17:52 #11
Nej, for et enkelt mellemrum er jo det samme som at sende et mellemrum og det er OUTPUT :)
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