php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.05.2008, 07:03  
Neuer Benutzer
 
Registriert seit: 18.05.2008
Beiträge: 14
wolf1985 befindet sich auf einem aufstrebenden Ast
wolf1985 eine Nachricht über ICQ schicken wolf1985 eine Nachricht über MSN schicken wolf1985 eine Nachricht über Skype™ schicken
Standard 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

Geändert von wolf1985 (18.05.2008 um 07:05 Uhr). Grund: Code hinzugefügt
wolf1985 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 18.05.2008, 09:41  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Erstmal eine Rückfrage: Steht in der Datei nur eine SQL Anweisung drin?
David ist offline  
Alt 18.05.2008, 10:10  
Neuer Benutzer
 
Registriert seit: 18.05.2008
Beiträge: 14
wolf1985 befindet sich auf einem aufstrebenden Ast
wolf1985 eine Nachricht über ICQ schicken wolf1985 eine Nachricht über MSN schicken wolf1985 eine Nachricht über Skype™ schicken
Standard

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
wolf1985 ist offline  
Alt 18.05.2008, 11:23  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Dann habe ich noch zwei Fragen:
  1. Zitat:
    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?
David ist offline  
Alt 18.05.2008, 11:38  
Neuer Benutzer
 
Registriert seit: 18.05.2008
Beiträge: 14
wolf1985 befindet sich auf einem aufstrebenden Ast
wolf1985 eine Nachricht über ICQ schicken wolf1985 eine Nachricht über MSN schicken wolf1985 eine Nachricht über Skype™ schicken
Standard

Zitat:
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
wolf1985 ist offline  
Alt 18.05.2008, 12:11  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

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)?
David ist offline  
Alt 18.05.2008, 12:15  
Neuer Benutzer
 
Registriert seit: 18.05.2008
Beiträge: 14
wolf1985 befindet sich auf einem aufstrebenden Ast
wolf1985 eine Nachricht über ICQ schicken wolf1985 eine Nachricht über MSN schicken wolf1985 eine Nachricht über Skype™ schicken
Standard

Zitat:
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.
wolf1985 ist offline  
Alt 18.05.2008, 12:54  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
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.
David ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Bild verschafft sich platz HTML, Usability und Barrierefreiheit 14 11.08.2008 23:45
mit DropDown DIV inhalt ändern Soese HTML, Usability und Barrierefreiheit 2 30.06.2008 01:38
Variable mit externen Inhalt setzen? errox PHP Tipps 2008 7 30.05.2008 21:39
Textdatei erstellen - Inhalt mit Variablen füllen DDogg PHP Tipps 2006 3 25.09.2006 13:44
Per FTP einen Ordner inkl. Inhalt löschen? BartTheDevil89 PHP Tipps 2006 2 10.09.2006 11:46
Inhalt eines Feldes auf anderer Seite übernehmen Asipak PHP Tipps 2006 2 11.06.2006 17:39
Inhalt zentrieren trotz Scrolleiste max-dhom HTML, Usability und Barrierefreiheit 5 20.05.2006 17:24
innerHTML/document.write und Inhalt in anderen Frame ändern HTML, Usability und Barrierefreiheit 1 29.01.2006 10:35
Mails an PHP übergeben und Inhalt auslesen? ThaRider PHP Tipps 2006 16 16.01.2006 21:59
Inhalt einer Text-Datei löschen PHP Tipps 2005-2 3 11.07.2005 23:21
[Erledigt] Eingabefeld: Bei Klick in's Feld Inhalt markieren HTML, Usability und Barrierefreiheit 5 13.06.2005 23:16
Inhalt in Layout einfügen PHP Tipps 2004 1 25.09.2004 14:15
Variablen inhalt verändern (löschen und einfügen) PHP Tipps 2004 2 16.09.2004 11:57
Inhalt einer .txt-Datei löschen PHP Tipps 2004 5 28.08.2004 22:16
Inhalt einer Datei einbinden ohne Inhalt anzuzeigen Corvin PHP Tipps 2004 4 22.07.2004 09:24

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
getqueriesfromfile, nach hochladen nicht lesbare inhalte, quellcode ftp upload verändert, fileupload inhalt wird verändert, php datei verändert sich beim hochladen, code verändert beim hochladen, fileuload der datei splittet, inhalt verändert nach file upload, wie lese ich eine extrahierte sql datei mit php ein ?, php upload verändert, regex files php upload, sehen ob datei auf server aendert, sql aktualisieren auf hochgeladener website?, unlink($sqldatei), nach upload php datei kommentar, datei wird beim ftp upload verändert, php check ob file verändert wurde, inhalt hochladen html

Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum