zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden SQL Export und Import - Probleme

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 17.05.2008, 09:48
Supporter
neuer user
Thread-Ersteller
 
Registriert seit: 11.02.2008
Ort: CH-8957 Spreitenbach
Beiträge: 46
wolf1985 befindet sich auf einem aufstrebenden Ast
Standard SQL Export und Import - Probleme

Hallo Zusammen

Das erste Problem habe ich somit gelöst, dass ich die Export-Funktionen lediglich auf eine einzelne, externe PHP-Datei versetzt habe.

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!)
PHP-Code:
//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

Geändert von wolf1985 (18.05.2008 um 11:51 Uhr)
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 18.05.2008, 10:29
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 11.09.2006
Beiträge: 1.008
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

Schau mal, was du hier machst:

PHP-Code:
            $sql "source ".$des_file
            
mysql_query($sql) OR die(mysql_error()); 
Mit anderen Worten:

PHP-Code:
mysql_query('source' $des_file); 
Da steht dann also dein Dateiname im Query! MySQL liest die Datei nicht automatisch ein!

Code:
mysql_query(file_get_contents($sql));
Allerdings darfst du pro mysql_query() nur eine Abfrage ausführen, soweit ich weiß.

Edit: Ups... "source" steht ja für Stapelverarbeitung. Hab ich nicht gewusst, sorry

Geändert von fox (18.05.2008 um 10:32 Uhr)
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 18.05.2008, 11:07
Supporter
neuer user
Thread-Ersteller
 
Registriert seit: 11.02.2008
Ort: CH-8957 Spreitenbach
Beiträge: 46
wolf1985 befindet sich auf einem aufstrebenden Ast
Standard

Hallo fox.

Das habe ich eben auch gerade bemerkt und mir nun eine Funktion zusammengebastelt aus verschiedenen Infos und Anregungen von Foren, Google Suche etc..

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!

EDIT: Zeilenweise aus diesem Grunde von Vorteil, wenn SQL-Dateien einmal sehr grosse Grössen annehmen...

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); 
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

Geändert von wolf1985 (18.05.2008 um 11:48 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 18.05.2008, 12:47
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 11.09.2006
Beiträge: 1.008
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

Ob ein # am Anfang der Zeile steht kannst du ganz leicht mit preg_match herausfinden:

PHP-Code:
if (preg_match('!^#.*!m'$query)) {
    echo 
"Ein # steht am Anfang der Zeile!";

Das kannst du nun nach dem Splitten machen und einfach die Zeile überspringen/rausfiltern

PHP-Code:
unlink(0000); 
Was ist das?


Bist du sicher, dass die Datei auch existiert? Schau mal nach, ob du in dem entsprechenden Ordner Schreibrechte hast...
Mit Zitat antworten
  #5 (permalink)  
Alt 18.05.2008, 12:58
Supporter
neuer user
Thread-Ersteller
 
Registriert seit: 11.02.2008
Ort: CH-8957 Spreitenbach
Beiträge: 46
wolf1985 befindet sich auf einem aufstrebenden Ast
Standard

Hallo fox.

Ne hab den falschen Code entdeckt, ich hab statt # einfach -- geschrieben.
PHP-Code:
// and filter (remove) those lines, beginning with an sql comment token
    
$file array_filter(file($file),
                         
create_function('$line',
                                         
'return strpos(ltrim($line), "--") !== 0;')); 
dort bei ltrim sollte "#" sein und nicht "--", denn meine SQL-Export-Funktion schreibt alle Kommentare nur mit # vorraus, auch die linien.

unlink hab ich geändert / entfernt. Sollt eigentlich umask heissen. *smile*


Also Probleme gelöst. Sogar schneller als ich dachte, auch wenn mir die Antworten gar nicht geholfen haben *grins*.

Jetzt mal Kaffeeeepause... <-- kommst mit??
Mit Zitat antworten
  #6 (permalink)  
Alt 18.05.2008, 13:00
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 11.09.2006
Beiträge: 1.008
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von wolf1985 Beitrag anzeigen
Also Probleme gelöst. Sogar schneller als ich dachte, auch wenn mir die Antworten gar nicht geholfen haben *grins*.

Jetzt mal Kaffeeeepause... <-- kommst mit??
Kaffee? Nein, jetzt gibts erstmal Mittagessen ...
Mit Zitat antworten
  #7 (permalink)  
Alt 18.05.2008, 13:07
Supporter
neuer user
Thread-Ersteller
 
Registriert seit: 11.02.2008
Ort: CH-8957 Spreitenbach
Beiträge: 46
wolf1985 befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
if ($kaffepause == true)
{
preg_replace(kaffemittagessen);
}
else
{
mysql_query("INSERT kaffe TO Mittagessen");


Geändert von wolf1985 (18.05.2008 um 13:13 Uhr)
Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
SQL Abfrage gabischatz Serveradministration und serverseitige Scripte 4 23.04.2011 12:05
paar Probleme mit dem CSS Layout SimonK. CSS 6 05.10.2008 15:57
Probleme mit dem Border im IE6 bullseye CSS 9 30.10.2007 17:21
CSS-Problem mit IE, FF und Opera ohne Probleme ForrestFunk CSS 1 26.10.2006 12:32
IE: Probleme mit ul-Menü Ares CSS 4 18.10.2006 12:42


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:34 Uhr.