[PHP / SQL] - Einige Probleme beim Export und Import



  • Hallo Zusammen

    DIeser Beitrag wird wahrscheinlich ein bisschen lange. Ich habe mir mal ein Script gebastelt, dass die Daten aus einer SQL-Datenbank exportiert und anschliessend als .sql-Datei ausgibt.

    Soweit so gut. Allerdings stelle ich andauernd fest, dass dann in der exportierten SQL Datei ALLE HTML-headers von DOCTYPE bis zu </html> noch drum herum drin sind!! Warum ist das so?? Das sollte nicht drin stehen oder ?

    Hier mal das EXPORT-\1:

    $structure_only=false;
                //set TRUE to to get file with dump
                $output = true;
    
                function mysqlbackup($host,$dbname, $uid, $pwd, $structure_only, $crlf) {
    
                 $con=@mysql_connect("localhost",$uid, $pwd) or die("Could not connect");
                 $db=@mysql_select_db($dbname,$con) or die("Could not select db");
    
                 // here we check MySQL Version
                 $result=@mysql_query("SELECT VERSION() AS version");
                 if ($result != FALSE && @mysql_num_rows($result) > 0) {
                  $row   = @mysql_fetch_array($result);
                  $match = explode('.', $row['version']);
                 } else {
                  $result=@mysql_query("SHOW VARIABLES LIKE \'version\'");
                  if ($result != FALSE && @mysql_num_rows($result) > 0){
                   $row   = @mysql_fetch_row($result);
                   $match = explode('.', $row[1]);
                  }
                 }
    
                 if (!isset($match) || !isset($match[0])) {
                  $match[0] = 3;
                 }
                 if (!isset($match[1])) {
                  $match[1] = 21;
                 }
                 if (!isset($match[2])) {
                  $match[2] = 0;
                 }
                 if(!isset($row)) {
                  $row = '3.21.0';
                 }
    
                 define('MYSQL_INT_VERSION', (int)sprintf('%d%02d%02d', $match[0], $match[1], intval($match[2])));
                 define('MYSQL_STR_VERSION', $row['version']);
                 unset($match);
    
                 $sql = "# MySQL dump by Globesolutions IT + EDV DL".$crlf;
                 $sql.= "# Host: $host Database: $dbname".$crlf;
                 $sql.= "----------------------------".$crlf;
                 $sql.= "# Server version: ".MYSQL_STR_VERSION.$crlf;
    
                 $sql.= $crlf.$crlf.$crlf;
                 out(1,$sql);
                 $res=@mysql_list_tables($dbname);
                 $nt=@mysql_num_rows($res);
    
                 for ($a=0;$a<$nt;$a++) {
                  $row=mysql_fetch_row($res);
                  $tablename=$row[0];
    
                  $sql=$crlf."# ----------------------------------------".$crlf."# table structure for table '$tablename' ".$crlf;
                  // For MySQL < 3.23.20
                  if (MYSQL_INT_VERSION >= 32321) {
                   $result=mysql_query("SHOW CREATE TABLE $tablename");
                   if ($result != FALSE && mysql_num_rows($result) > 0) {
                    $tmpres = mysql_fetch_array($result);
                    $pos           = strpos($tmpres[1], ' (');
                    $tmpres[1]     = substr($tmpres[1], 0, 13)
                                     . $tmpres[0]
                                     . substr($tmpres[1], $pos);
    
                    $sql .= $tmpres[1].";".$crlf.$crlf;
                   }
                   mysql_free_result($result);
                  } else {
                   $sql.="CREATE TABLE $tablename(".$crlf;
                   $result=mysql_query("show fields  from $tablename",$con);
    
                   while ($row = mysql_fetch_array($result)) {
                    $sql .= "  ".$row['Field'];
                    $sql .= ' ' . $row['Type'];
                    if (isset($row['Default']) && $row['Default'] != '') {
                     $sql .= ' DEFAULT \'' . $row['Default'] . '\'';
                    }
                    if ($row['Null'] != 'YES') {
                     $sql .= ' NOT NULL';
                    }
                    if ($row['Extra'] != '') {
                     $sql .= ' ' . $row['Extra'];
                    }
                    $sql .= ",".$crlf;
                   }
    
                   mysql_free_result($result);
                   $sql = ereg_replace(',' . $crlf . '$', '', $sql);
    
                   $result = mysql_query("SHOW KEYS FROM $tablename");
                    while ($row = mysql_fetch_array($result)) {
                     $ISkeyname    = $row['Key_name'];
                     $IScomment  = (isset($row['Comment'])) ? $row['Comment'] : '';
                     $ISsub_part = (isset($row['Sub_part'])) ? $row['Sub_part'] : '';
                     if ($ISkeyname != 'PRIMARY' && $row['Non_unique'] == 0) {
                      $ISkeyname = "UNIQUE|$kname";
                     }
                     if ($IScomment == 'FULLTEXT') {
                      $ISkeyname = 'FULLTEXT|$kname';
                     }
                     if (!isset($index[$ISkeyname])) {
                      $index[$ISkeyname] = array();
                     }
                     if ($ISsub_part > 1) {
                      $index[$ISkeyname][] = $row['Column_name'] . '(' . $ISsub_part . ')';
                     } else {
                      $index[$ISkeyname][] = $row['Column_name'];
                     }
                    }
                    mysql_free_result($result);
    
                    while (list($x, $columns) = @each($index)) {
                     $sql     .= ",".$crlf;
                     if ($x == 'PRIMARY') {
                      $sql .= '  PRIMARY KEY (';
                      } else if (substr($x, 0, 6) == 'UNIQUE') {
                      $sql .= '  UNIQUE ' . substr($x, 7) . ' (';
                     } else if (substr($x, 0, 8) == 'FULLTEXT') {
                      $sql .= '  FULLTEXT ' . substr($x, 9) . ' (';
                     } else {
                      $sql .= '  KEY ' . $x . ' (';
                     }
                     $sql     .= implode($columns, ', ') . ')';
                    }
                    $sql .=  $crlf.");".$crlf.$crlf;
    
                  }
                  out(1,$sql);
                 if ($structure_only == FALSE) {
                  // here we get table content
                  $result = mysql_query("SELECT * FROM  $tablename");
                  $fields_cnt   = mysql_num_fields($result);
                  while ($row = mysql_fetch_row($result)) {
                   $table_list     = '(';
                   for ($j = 0; $j < $fields_cnt; $j++) {
                    $table_list .= mysql_field_name($result, $j) . ', ';
                   }
                   $table_list = substr($table_list, 0, -2);
                   $table_list     .= ')';
    
                   $sql = 'INSERT INTO ' . $tablename
                                                   . ' VALUES (';
                   for ($j = 0; $j < $fields_cnt; $j++) {
                    if (!isset($row[$j])) {
                     $sql .= ' NULL, ';
                    } else if ($row[$j] == '0' || $row[$j] != '') {
                     $type          = mysql_field_type($result, $j);
                     // a number
                     if ($type == 'tinyint' || $type == 'smallint' || $type == 'mediumint' || $type == 'int' ||
                                        $type == 'bigint'  ||$type == 'timestamp') {
                      $sql .= $row[$j] . ', ';
                     }
                     // a string
                     else {
                      $dummy  = '';
                      $srcstr = $row[$j];
                      for ($xx = 0; $xx < strlen($srcstr); $xx++) {
                       $yy = strlen($dummy);
                       if ($srcstr[$xx] == '\\')   $dummy .= '\\\\';
                       if ($srcstr[$xx] == '\'')   $dummy .= '\\\'';
                       if ($srcstr[$xx] == "\x00") $dummy .= '\0';
                       if ($srcstr[$xx] == "\x0a") $dummy .= '\n';
                       if ($srcstr[$xx] == "\x0d") $dummy .= '\r';
                       if ($srcstr[$xx] == "\x1a") $dummy .= '\Z';
                       if (strlen($dummy) == $yy)  $dummy .= $srcstr[$xx];
                      }
                      $sql .= "'" . $dummy . "', ";
                     }
                    } else {
                     $sql .= "'', ";
                    } // end if
                   } // end for
    
                   $sql = ereg_replace(', $', '', $sql);
                   $sql .= ");".$crlf;
                   out(1,$sql);
    
                  }
                  mysql_free_result($result);
                  }
                 }
                 return;
                }
    
                function define_crlf() {
                 global $HTTP_USER_AGENT;
                 $ucrlf = "\n";
                 if (strstr($HTTP_USER_AGENT, 'Win')) {
                  $ucrlf = "\r\n";
                 }
                 else if (strstr($HTTP_USER_AGENT, 'Mac')) {
                  $ucrlf = "\r";
                 }
                 else {
                  $ucrlf = "\n";
                 }
                 return $ucrlf;
                }
    
                //print the result
                function out($fptr,$s)   {
                 echo $s;
                }
    
                if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) {
                 define('USER_BROWSER_AGENT', 'OPERA');
                } else if (ereg('MSIE ([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) {
                 define('USER_BROWSER_AGENT', 'IE');
                } else if (ereg('OmniWeb/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) {
                 define('USER_BROWSER_AGENT', 'OMNIWEB');
                } else if (ereg('Mozilla/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) {
                 define('USER_BROWSER_AGENT', 'MOZILLA');
                } else if (ereg('Konqueror/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) {
                 define('USER_BROWSER_AGENT', 'KONQUEROR');
                } else {
                 define('USER_BROWSER_AGENT', 'OTHER');
                }
    
                  $mime_type = (USER_BROWSER_AGENT == 'IE' || USER_BROWSER_AGENT == 'OPERA')
                                   ? 'application/octetstream'
                                   : 'application/octet-stream';
    
                $now = gmdate('D, d M Y H:i:s') . ' GMT';
                $date = date('d-M-Y');
                $filename = $db_name."-bak-".$date;
                $ext = "sql";
                $crlf = define_crlf();
                // Send headers
                if ($output == true) {
                 header('Content-Type: ' . $mime_type);
                 header('Expires: ' . $now);
                 // lem9 & loic1: IE need specific headers
                 if (USER_BROWSER_AGENT == 'IE') {
                  header('Content-Disposition: inline; filename="' . $filename . '.' . $ext . '"');
                  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                  header('Pragma: public');
                 } else {
                  header('Content-Disposition: attachment; filename="' . $filename . '.' . $ext . '"');
                  header('Pragma: no-cache');
    
                 }
                 mysqlbackup($db_host,$db_name,$db_user,$db_pass,$structure_only,$crlf);
                }
                 else {
                 echo "<html><body><pre>";
                 echo htmlspecialchars(mysqlbackup($db_host,$db_name,$db_user,$db_pass,$structure_only,$crlf));
                 echo "</PRE></BODY></HTML>";
                }
    

    also ich habe schon mit dem da Versucht (alles was im 1. Feld steht, ist das, was um die SQL - Inhalte drumrum steht, was ja nicht sein sollte):

    eregi_replace('
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <meta name="author" content="Kurz Dominic / GS"/>
    <meta name="publisher" content="Globesolutions IT + EDV DL"/>
    <meta name="copyright" content="Globesolutions IT + EDV DL"/>
    <meta name="page-topic" content="Tacholine Marinos - Reparatur und Einbaucenter"/>
    <meta name="keywords" content="informatik, support, dienstleistung, dienstleistungen, sozialwesen, sozial, arbeitslos, website, wolfsoft, globe, global, hosting, web, website, internet, computer, hardware, support, forum, services, mitglieder, members, community, shopt, onlineshop, hilfe, downloads, tips, tricks, php, scripts, programmieren, reisen, kurse, weiterbildung, kostenlos, gratis, wettbewerb, spezial, angebote, offerten, vergleich, home, homeservice, reparatur, pc, notebook, sponsoring, suche, kunden, kundenlogin, login, newsletter, email, it, veranstaltungen, applications, solutions, sozial, emotional, emotion, private, commercial, schüler, student, lehrling, erwachsene, pensioniert, anfänger, berufsleute, konzerne, gmbh, ag, geschäfte, partner, club, gold, specials, vergünstigungen, gutscheine, kompetent, team, globesolutions"/>
    <meta name="audience" content="Anfänger, Azubis, Erwachsene, Experten, Fortgeschrittene, Frauen, Jugendliche, Männer, Profis, Schüler, Studenten    "/>
    <meta http-equiv="content-language" content="de"/>
    <meta name="robots" content="index, follow"/>
    <title>Globesolutions IT + EDV Dienstleistungen / Online-Database-System (ODB / IDBS)</title>
    <link rel="stylesheet" type="text/css" href="style/main.css">
    </head>
    <body>
    
       <!-- Begin Wrapper -->
       <div id="wrapper">
    
             <!-- Begin Header -->
    
             <div id="header">
    
             Symbols - Toobar - Login - usw.
             </div>
             <!-- End Header -->
    
             <!-- Begin Navigation -->
             <div id="navigation">
    
             <a href="backinsset.php?op=reback" target="_self" style="color:blue;">Wiederherstellen / Backup einspielen</a>
             </div>
             <!-- End Navigation -->
    
             <!-- Begin Left Column -->
    
             <div id="leftcolumn">
    
               Spalte links
             </div>
             <!-- End Left Column -->
    
                      <!-- Begin Right Column -->
             <div id="rightcolumn">
    
             Spalte rechts
             </div>
             <!-- End Right Column -->
    
                  <!-- Begin Content Column -->
             <div id="content">', '', $sql);
    

    dies klappte aber auch nicht gemäss meinen Vorstellungen. Der HTML-Drumrum ist noch immer da. Dann das nächste Problem:

    DIE IMPORT-Funktion sieht bei mir folgendermassen aus (die Formularfelder, also das Durchsuchen-Feld hab ich nicht angegeben, da der Upload ja normal funktioniert!)

    //Wiederherstellen eines Backups (SQL-File)
                $filepath = $_SERVER['DOCUMENT_ROOT']."/intern_dbs/sql_temp/";
                $des_file = strtolower($filepath.$_FILES['sql_file']['name']);
                if(move_uploaded_file($_FILES['sql_file']['tmp_name'], $des_file)) {
    
                //Herstellen der DB Verbindung
                $connectionid_b  = mysql_connect ($db_host, $db_user, $db_pass);
                if (!mysql_select_db ($db_name, $connectionid_b))
                {
                  die ("<font color=red size=3><b>Datenbankverbindung fehlgeschlagen!</b></font><br />Konnte Backup nicht durchführen.<br /><br /><a href=\"".$_SERVER['PHPSELF']."?op=reback&make=default\" target=\"_self\" style=\"color:blue;\">[ <b>Zurück</b> ]</a>");
                }
    
                //Ausführen der SQL-Datei (IMPORT)
                $sql = "source ".$des_file;
                mysql_query($sql) OR die(mysql_error());
    
                //Schliessen der DB-Verbindung
                mysql_close($connectionid_b);
    
                //Hochgeladene Datei vom Server (aus Sicherheitsgründen) wieder entfernen
                $tmp_sql_file = $des_file;
                unlink($tmp_sql_file);
    
                //Erfolgsmeldung
                 echo '<b>IDB / ODBS - Backup - Wiederherstellung</b><hr /><br />
                Das Backup wurde <font color=green><b>erfolgreich</b></font> durchgeführt!<br />
                Aus Sicherheitsgründen wurde die Datei wieder vom Server entfernt.<br /><br />
                <b>BK-File-Report:</b> <i>'.$_FILES['sql_file'].'</i><br /><br />
                <a href="index.php" target="_self" style="color:blue;">[ <b>Zurück</b> ]</a>';
                } else {
                //Misserfolg
                echo '<b>IDB / ODBS - Backup - Wiederherstellung</b><hr /><br />
                Wiederherstellung <font color=red><b>fehlgeschlagen</b></font>!<br />
                Die ausgewählte SQL-Datei existiert nicht oder es ist in Fehler aufgetreten.<br />
                <a href="'.$_SERVER['PHPSELF'].'?op=reback&make=default" target="_self" style="color:blue;">[ <b>Zurück</b> ]</a>';
                }
    

    Das Problem ist hier, sollte die SQL Datei normal sein wie jede ander auch, dass beim Upload der Dateiinhalt auf eine einzige Zeile rutscht, obwohl das in der Originaldatei nicht so aussieht sondern mehrzeilig ist. Genau deshalb bekomme ich dann beim Upload ein FATAL ERROR von SQL zurückgeliefert, der in Zeile 1 stehen soll..

    Zeile 1 ist ja das # vordran. Ja, lade ich die Datei über phpMyAdmin hoch (da SQL FIle ja Mehrzeilig ist) gehts ohne Fehler.

    Woran liegt das denn am Upload?? Kann man irgendwie ererichen das beim Fileupload der Dateiinhalt .- sofern dieser mehrzeilig ist - auch mehrzeilig beibehalten wird?

    Gruss
    Wolf



  • DIeser Beitrag wird wahrscheinlich ein bisschen lange.

    Und das muss er nicht sein.

    In Deinem ganz eigenen Interesse solltest Du lernen den Problembereich Deines Quelltextes zu präzisieren.

    Überlege Dir etwas genauer, was Du den Menschen, die Dir helfen sollen, zumutest.

    lg Max



  • Du hast in deiner Ausgabe eben das was Du ausgibst.
    Und zwar genau das was Du an den Client gibst.
    Eine "Datei an den Client senden" != "HTML und Datei senden"

    Mache eine Debug und schaue genau was Du in deinem Variablen stehen hast.


Anmelden zum Antworten