Ankündigung

Einklappen
Keine Ankündigung bisher.

Fileupload - Inhalt wird verändert

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Fileupload - Inhalt wird verändert

    Hallo Zusammen

    Ich komme dem Problem einfach nicht auf die Spur. Über meine Webseite wollte ich eine SQL-Datei hochladen. Ihr wisst ja sicherlich, dass diese SQL-Dateien, wenn man diese mit einem Editor (bsp. Proton) öffnet, mehrzeilig sind und auch so von SQL und phpMyAdmin erkannt und korrekt ausgeführt werden.

    Nun, wenn ich die Datei mittels Uploadformular hochlade, dann klappt das zwar, aber SQL gibt immer wieder einen Fatal Error in Line 1 zurück. Kopiere ich den Code so wie er in der SQL Datei steht in phpMyAdmin oder lade ich diese dort hoch, klappt alles.

    ich schaute die hochgeladene Datei an und musste feststellen, dass der Upload den gesamten Inhalt der Datei nur auf eine einzige Zeile geschrieben hat, die fast unendlich in die Länge geht. Ich vermute dass dies der Grund für den Fehler ist.

    Nun zu meiner Frage: Wie bringe ich PHP dazu, die Dateien während eines Uploads im Inhalt unverändert zu lassen?? So, dass die SQL-Datei auch nach dem Upload noch mehrzeilig ist, genau so, wie sie auch auf dem lokalen REchner gespeichert wurde ??

    Hier noch die Uploadfunktion:
    PHP-Code:
    $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); 
    bis zum move_uploaded_file wird die Datei ja hochgeladen. Anschliessend sollte die SQL-Datei danach ausgeführt werden und in MySQL importiert werden. Quasi ein Bakup.

    Freundliche Grüsse
    Wolf

  • #2
    Erstmal eine Rückfrage: Steht in der Datei nur eine SQL Anweisung drin?

    Kommentar


    • #3
      Hallo.

      Ja bis auf weiteres. Allerdings mit Kommentaren. Ich habe mir nun etwas gesucht und gefunden und damit eine funktion zusammen gebastelt.

      Diese liest die Datei nun Zeilenweise ein und fügt diese danach wieder zusammen. Anschliessend rufe ich die Funktion im Script, wessen ich das Bakup machen will wieder auf und siehe da, es funktioniert!

      Aber es funktioniert nur, wenn in der SQL keine Kommentare stehen... beinhaltet die SQL-Datei kommentare wie #MYSql Version ... oder #-------- dann funktioniert alles nicht mehr.

      Wie kann ich nun PHP (der Funktion) sagen, dass alle Zeilen (inkl alle Zeichen in der gleichen Zeile dahinter), welche mit # beginnen entfernt werden sollen ???


      Hier die functions.inc (die Funktion):
      PHP-Code:
       <?php 
      function getQueriesFromFile($file

          
      // import file line by line 
          // and filter (remove) those lines, beginning with an sql comment token 
          
      $file array_filter(file($file), 
                               
      create_function('$line'
                                               
      'return strpos(ltrim($line), "--") !== 0;')); 
          
      // this is a list of SQL commands, which are allowed to follow a semicolon 
          
      $keywords = array('ALTER''CREATE''DELETE''DROP''INSERT''REPLACE''SELECT''SET'
                            
      'TRUNCATE''UPDATE''USE'); 
          
      // create the regular expression 
          
      $regexp sprintf('/\s*;\s*(?=(%s)\b)/s'implode('|'$keywords)); 
          
      // split there 
          
      $splitter preg_split($regexpimplode("\r\n"$file)); 
          
      // remove trailing semicolon or whitespaces 
          
      $splitter array_map(create_function('$line'
                                                
      'return preg_replace("/[\s;]*$/", "", $line);'), 
                                
      $splitter); 
          
      // remove empty lines 
          
      return array_filter($splittercreate_function('$line''return !empty($line);')); 

      ?>
      Hier der PHP-Teil, welcher das SQL hochlädt, funktion ausführt und Query ausführt:
      PHP-Code:
      //Wiederherstellen eines Backups (SQL-File) 
                  
      unlink(0000); 
                  
      $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)) { 
                  
      chmod($filepath.$_FILES['sql_file']['name'], "0644"); 
                  
      //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>"); 
                  } 

                  
      //Vorhandene Tabellen löschen und durch BACKUP-Einträge ersetzen 
                  
      mysql_query("DROP TABLE benutzerdaten, clients, faktura, artikel, stsatz;"); 

                  
      //SQL-Datei extrahieren und ausführen 
                  
      $csvfile $_SERVER['DOCUMENT_ROOT']."/intern_dbs/sql_temp/".$_FILES['sql_file']['name']; 
                  if (!
      is_readable($csvfile)) { 
                    die(
      "$csvfile does not exist or is not readable"); 
                  } 
                  
      $queries getQueriesFromFile($csvfile); 
                  for (
      $i 0$ix count($queries); $i $ix; ++$i) { 
                    
      $sql $queries[$i]; 
                    if (!
      mysql_query($sql)) { 
                      die(
      sprintf("error while executing mysql query #%u: %s<br />\nerror: %s"$i 1$sqlmysql_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); 
      </span></span>Das entfernen von #-Zeilen weiss ich im moment nicht, wie ich das anstellen sollte (muss zur functions.inc noch dazugefügt werden).

      Ebenfalls bekomme ich nach dem Upload die Fehlermeldung, dass die SQL-Datei nicht lesbar ist. Deshalb versuche ich (wie oben zu sehen) mit unlink und chmod die hochgeladene Datei mit dem Rechten 644 oder resp. auch 755 zu versehen. Allerdings klappt das auch nicht so, wie ich es mir vorgestellt hatte... warum ??

      Gruss
      Wolf

      Kommentar


      • #4
        Dann habe ich noch zwei Fragen:
        1. Zitat von wolf1985 Beitrag anzeigen
          ich schaute die hochgeladene Datei an
          Wie hast Du das getan?
        2. Von was für einem Computer (Betriebssystem) auf was für einen Computer wird die Datei übertragen?

        Kommentar


        • #5
          Zitat von David Beitrag anzeigen
          Dann habe ich noch zwei Fragen:
          1. Wie hast Du das getan?
          2. Von was für einem Computer (Betriebssystem) auf was für einen Computer wird die Datei übertragen?

          Ich meinte nicht auf dem Server. Das Script hat ja die Datei xxxx-irgendwas.sql in das sql_temp verzeichnis vom Server hochgeladen. Danach nahm ich das FTP Programm und kopierte die hochgeladene Datei vom Server auf meinen Rechner, um zu sehen, ob alles korrekt ist. Und es ist korret.

          Der Upload ist gar nicht mehr das Problem, sondern lediglich noch das Entfernen von Kommentarzeilen die mit # beginnen... siehe mein leztes Posting (vor diesem da).

          EDIT: Von Windows Vista nach Linux... why? *g*

          Gruss

          Kommentar


          • #6
            D.h. wenn Du getQueriesFromFile() nicht aufrufst, bleibt die Datei in Ordnung, genauso, wie Du sie abgeschickt hast, mehrzeilig?
            Und wenn Du sie durch getQueriesFromFile() bearbeiten läßt, ist hinterher alles in einer Zeile (wenn da Kommentar drin sind)?

            Kommentar


            • #7
              Zitat von David Beitrag anzeigen
              D.h. wenn Du getQueriesFromFile() nicht aufrufst, bleibt die Datei in Ordnung, genauso, wie Du sie abgeschickt hast, mehrzeilig?
              Und wenn Du sie durch getQueriesFromFile() bearbeiten läßt, ist hinterher alles in einer Zeile (wenn da Kommentar drin sind)?
              Wie ich schon gesagt habe geht es nicht mehr über die mehrzeilige oder einzeilge Inhaltsserie einer Datei sondern um das löschen von Kommentaren in der SQL-Datei, bevor mit dem extrahieren begonnen wird.

              Dieses Problem konnte ich aber auch lösen!

              Habe in der Funktion ltrim("--") durch ltrim("#"); ersetzt, da alle KOmmentare bei der Export-Files nicht mit - sondern # beginnen.

              Kommentar


              • #8
                Zitat von wolf1985 Beitrag anzeigen
                Wie ich schon gesagt habe geht es nicht mehr über die mehrzeilige oder einzeilge Inhaltsserie einer Datei sondern um das löschen von Kommentaren in der SQL-Datei, bevor mit dem extrahieren begonnen wird.
                Das wurde mir aus den bisherigen Beiträgen nicht klar. Offenkundig hätte es aber klar sein müssen. Also habe ich ein Verständnisproblem und mache deshalb hier Pause.

                Kommentar

                Lädt...
                X