PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   SQL / Datenbanken (https://www.php-resource.de/forum/sql-datenbanken/)
-   -   mysql dump einlesen (https://www.php-resource.de/forum/sql-datenbanken/24420-mysql-dump-einlesen.html)

BrainBug 15-08-2003 14:18

PHP-Code:

$dump file('pfad/zum/dump_file.sql');
for (
$i=0$i<count($dump); $i++) {
  
$sql trim($dump[$i]);
  
mysql_query($sql);
  } 

da du den Dump selbst erzeugst, solltest du darauf achten, dass keine Kommentarzeilen oder Leerzeilen vorkommen und dass der CREATE-Befehl in einer Zeile ausgeben wird. phpMyAdmin macht das nämlich nicht.
ansonsten muss man in der Schleife solche Dinge eben abfangen, also z.B.
PHP-Code:

if (substr($sql,0,1) != "#" && substr($sql,0,1) != "/" && $sql != ""mysql_query($sql); 

aufpassen mußte du auch bei Texteinträgen mit einem Umbruch (\n) drin -> beim Dump erzeugen mußt du die durch einen Backslash \ maskieren, sonst hast du da plötzlich eine neue Zeile im Dump-File.

Oder wie erzeugst du den Dump-File?

Hast du schon mal vom Rechner aus über den Prompt versucht, dich über telnet einzuloggen?

Kicky 15-08-2003 14:20

ich gestehe ich weiss nicht mal wie ich das anstellen soll mich über telnet einzuloggen. (Schamesröte)

Gruß Kicky

Kicky 15-08-2003 14:25

Meinen Dump erstelle ich folgendermassen:

PHP-Code:


// Struktur der Tabelle einlesen

    
unset($def,$index);
    
$def .= "DROP TABLE IF EXISTS $tabellenname;\r\n";
    
$def .= "CREATE TABLE $tabellenname (\r\n"
    
$result3 mysql_db_query($database"SHOW FIELDS FROM $tabellenname");
    while (
$row mysql_fetch_array($result3)) {
        
$def .= "    ".$row["Field"]." ".$row["Type"];
        if (
$row["Default"] != "") { $def .= " DEFAULT '".$row["Default"]."'"; }
        if (
$row["Null"] != "YES") { $def .= " NOT NULL"; }
        if (
$row["Extra"] != "") { $def .= " ".$row["Extra"]; }
        
$def .= ",\r\n";
    }
    
$def ereg_replace(",\r\n$"""$def);
    
$result3 mysql_db_query($database"SHOW KEYS FROM $tabellenname");
    while (
$row mysql_fetch_array($result3)) {
        
$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(
$xy$columns) = each($index)) {
        
$def .= ",\r\n";
        if (
$xy == "PRIMARY"$def .= "    PRIMARY KEY (".implode($columns", ").")";
        else if (
substr($xy,0,6) == "UNIQUE"$def .= "    UNIQUE ".substr($xy,7)." (".implode($columns", ").")";
        else 
$def .= "    KEY $xy (".implode($columns", ").")";
    }
    
$def .= "\r\n);\r\n\r\n";

// Ende Struktur Modul
    
$db mysql_select_db($database);
    
$tabelle "".$tabelle;
    
$text "#\r\n# Daten für Tabelle `$tabellenname`\r\n#\r\n\r\n";

    
$fd fopen($file_name,"a+"); 
    
fwrite($fd$text.$def); 
    
fclose($fd);

    unset(
$data);
    if (
$tabelle "") {
        
$ergebnis[] = mysql_select_db($database);
        
$result mysql_query("SELECT * FROM $tabellenname");
        
$anzahl mysql_num_rows($result);
        
$spaltenzahl mysql_num_fields($result);
        for (
$i 0$i $anzahl$i++) {
            
$zeile mysql_fetch_array($result);
            
$data .= "INSERT INTO $tabellenname (";
            for (
$spalte 0$spalte $spaltenzahl$spalte++) {
                
$feldname mysql_field_name($result$spalte);
                if (
$spalte == ($spaltenzahl 1)) {
                    
$data.= $feldname;
                } else {
                    
$data.= $feldname.",";
                }
            }
            
$data .= ") VALUES (";
            for (
$k=0;$k $spaltenzahl;$k++) {
                if (
$k == ($spaltenzahl 1)) {
                    
$data .= "'".addslashes($zeile[$k])."'";
                } else {
                    
$data .= "'".addslashes($zeile[$k])."',";
            }
            }
            
$data .= ");\r\n";
        }
        
$data .= "\r\n";
    } else {
        
$ergebnis[] = "Keine Tabelle übergeben";
    } 

Gruß Kicky

BrainBug 15-08-2003 14:37

so müßte eigentlich der Dump ohne überflüssige Kommentare und Leerzeilen erzeugt werden. Dann wird auch die recht schlichte Version des Auslesens funktionieren.
PHP-Code:

// Struktur der Tabelle einlesen

    
unset($def,$index);
    
$def .= "DROP TABLE IF EXISTS $tabellenname;\r\n";
    
$def .= "CREATE TABLE $tabellenname ("
    
$result3 mysql_db_query($database"SHOW FIELDS FROM $tabellenname");
    while (
$row mysql_fetch_array($result3)) {
        
$def .= "    ".$row["Field"]." ".$row["Type"];
        if (
$row["Default"] != "") { $def .= " DEFAULT '".$row["Default"]."'"; }
        if (
$row["Null"] != "YES") { $def .= " NOT NULL"; }
        if (
$row["Extra"] != "") { $def .= " ".$row["Extra"]; }
        
$def .= ", ";
    }
    
$def substr($def,0,-2); // letztes ", " abschneiden
    
$result3 mysql_db_query($database"SHOW KEYS FROM $tabellenname");
    while (
$row mysql_fetch_array($result3)) {
        
$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(
$xy$columns) = each($index)) {
        
$def .= ", ";
        if (
$xy == "PRIMARY"$def .= "    PRIMARY KEY (".implode($columns", ").")";
        else if (
substr($xy,0,6) == "UNIQUE"$def .= "    UNIQUE ".substr($xy,7)." (".implode($columns", ").")";
        else 
$def .= "    KEY $xy (".implode($columns", ").")";
    }
    
$def .= ");\r\n";

// Ende Struktur Modul
    
$db mysql_select_db($database);
    
$tabelle "".$tabelle;
    
//$text = "#\r\n# Daten für Tabelle `$tabellenname`\r\n#\r\n\r\n";

    
$fd fopen($file_name,"a+"); 
    
fwrite($fd$def); 
    
fclose($fd);

    unset(
$data);
    if (
$tabelle "") {
        
$ergebnis[] = mysql_select_db($database);
        
$result mysql_query("SELECT * FROM $tabellenname");
        
$anzahl mysql_num_rows($result);
        
$spaltenzahl mysql_num_fields($result);
        for (
$i 0$i $anzahl$i++) {
            
$zeile mysql_fetch_array($result);
            
$data .= "INSERT INTO $tabellenname (";
            for (
$spalte 0$spalte $spaltenzahl$spalte++) {
                
$feldname mysql_field_name($result$spalte);
                if (
$spalte == ($spaltenzahl 1)) {
                    
$data.= $feldname;
                } else {
                    
$data.= $feldname.",";
                }
            }
            
$data .= ") VALUES (";
            for (
$k=0;$k $spaltenzahl;$k++) {
                if (
$k == ($spaltenzahl 1)) {
                    
$data .= "'".addslashes($zeile[$k])."'";
                } else {
                    
$data .= "'".addslashes($zeile[$k])."',";
            }
            }
            
$data .= ");\r\n";
        }
        
$data .= "\r\n";
    } else {
        
$ergebnis[] = "Keine Tabelle übergeben";
    } 


BrainBug 15-08-2003 14:41

Zitat:

Original geschrieben von Kicky
ich gestehe ich weiss nicht mal wie ich das anstellen soll mich über telnet einzuloggen. (Schamesröte)
ja, ab in die Ecke und schäm dich. ;)

wenn du einen Windows-Rechner hast, dann über den Prompt ("Start" > "Ausführen" > eingeben "cmd" > Fenster geht auf) einfach folgender Befehl:

telnet URL_von_deinem_webspace

und abwarten. Wenn telnet überhaupt möglich, dann wird nach dem User und dem Passwort gefragt -> User und Passwort müßte dann das von deinem Account sein. Falls nicht, sagt dir das Programm, dass der Connect nicht möglich ist. Dann war's schade.

P.S.: wirklich NUR die Url, NICHT mit http:// eingeben

Kicky 15-08-2003 14:45

Ganz lieben Dank,

da werde ich mich erst einmal durchwühlen. Ich werde mich melden wenn es funktioniert - und wenn nicht wohl auch.

Gruß Kicky

BrainBug 15-08-2003 14:49

okay
 
klaro, mach das.

Ich bin vermutlich erst wieder am Montag im Forum unterwegs.
Bis dann und schönes Wochenende (falls wir uns in den nächsten 1-2 Stunden nichts mehr schreiben ;) )

Kicky 18-08-2003 15:20

@ BrainBug


Hallo,

ich hoffe Du hattest ein erholsames Wochenende. Zuerst noch mal lieben Dank für Deine Unterstützung am Freitag. Es ist unglaublich aber wahr, es funktioniert jetzt fast! Fast leider nur deswegen. Ich weiss immer noch nicht wie ich es löse wenn jemand etwas in die DB eingiebt mit breaks. Der User giebt etwas in eine Textarea ein. Wie bekomme ich die (sie sind ja mittendrinnen) nun raus um im dump alles in einer Zeile zu haben. Hast du dafür noch eine Idee für mich? Danke vorab ich werde auch weiter nach einer Lösung für dieses hoffentlich letzte Problem in dieser Angelegenheit suchen. Also so long

Kicky

BrainBug 18-08-2003 15:35

hmm, ich dachte eigentlich, dass das mit dem addslashes() ausreichen würde. Scheinbar nicht...

probier's mal so

PHP-Code:

$dump file('pfad/zum/dump_file.sql');
$sql="";
for (
$i=0$i<count($dump); $i++) {
  
$sql .= trim($dump[$i]);
  if (
substr($sql,0,6)=="INSERT" && substr($sql,-4)==");\r\n") {  
    
mysql_query($sql);
    
$sql="";
    }
  } 

die if-Abfrage prüft, ob die Zeile mit dem INSERT-Befehl beginnt und auch mit dem korrekten Abschluss endet. Falls nicht, wird der SQL-Query ausgelassen und der nächste Array-Eintrag an den bestehenden String angehängt, und zwar solange, bis das INSERT-Zeilenende kommt. Bin mir nicht sicher, ob die Abfrage nach den Steuerzeichen so funktioniert. Einfach mal testen...

P.S.: Wochenende war mal wieder zukurz für all das, was ich vor hatte. Aber trotzdem erholsam, danke der Nachfrage :p

Kicky 18-08-2003 15:59

Herzlichen Dank für deine super schnelle Antwort.

Die Abfrage nach den Steuerzeichen funktioniert so leider nicht. Ich bin am überlegen ob es auch an meiner Eingabe in die DB liegen kann. Ob ich da nicht schon etwas abfangen kann. Der User muss zwar die möglichkeit haben Zeilenumbrüche zu machen, aber ich bin gerade am schauen ob ich das anders einbauen muss damit es korrekt ist und auch wieder ausgelesen werden kann. Die Anzeige im Browser ist ok, aber eben nicht beim einlesen des dumps. Wenn ich einen Eintrag ohne Zeilenumbrüche habe wird er einwandfrei eingelesen.


Gruß Kicky

Kicky 18-08-2003 16:08

Ich habe es noch einmal geprüft und das Problem scheint nur aufzutreten, wenn bei der Eingabe in dei DB die returntaste genutzt wird. Dann liest er mir den dum nicht mehr wieder ein. Ich vermute also das das einspielen des Dumpes ok ist und ich bei der Eingabe in die db bzw. beim erstellen des dumpes diese Situation berücksichtigen muss.

Kannst du mir kurz bestätigen ob ich mit diesem Gedankengang richtieg liege? Meine Güte wie lernen andere Leute so etwas?? Oder ich stelle mich besonders dusselig an.

Danke für alles

Gruß Kicky

Kicky 18-08-2003 17:58

Unglaublich aber wahr!!!!!!!
Es funktioniert!!!!!!!

Ich wollte mich nur noch einmal von Herzen bedanken und hoffe ich bekommme jetzt keine Rechnung für privatstunden. Ich bin noch einmal unseren gesamten Thread von Freitag durchgegangen und habe gegrübelt. Dann fiel es mir wie Schuppen von den Augen und ich habe es mit

PHP-Code:

addcslashes() 

versucht. Siehe da, das hat funktioniert.
In meinem Eifer am Freitag hatte ich völlig vergessen Dir zu sagen das der Telnet-zugang nicht möglich war. Also noch einmal super herzlichen Dank

Gruß Kicky

BrainBug 19-08-2003 11:18

gern geschehen. :)

und Abrechnungen über Privatstunden gibt es hier nicht. Das ist alles in der Pauschale drin, die du mir bitte sofort und ohne Abzug auf mein Konto überweist :D

Ciao
BrainBug


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:54 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG