Antworten auf deine Fragen:
Neues Thema erstellen

Datenbank in Einzelteile zerlegen

Hallo, ich habe folgende Aufgabe:
Ich soll den Inhalt einer Datenbank mit Hilfe eines Formulars in eine andere Datenkbank exportieren/kopieren.

Dabei soll ich in folgenden Schritten arbeiten:
1. Verbindung herstellen
2. Tabellen in DB auslesen
3. Felder in Tabellen auslesen
4. Daten in Feldern auslesen
5. Daten in neue Datenbank eintragen (INSERT)

Mein Problem liegt zur Zeit bei Schritt 3.

Die Verbindung herstellen und die Tabellennamen auslesen funktioniert reibungslos.
Allerdings will ich jetzt mit Hilfe der Tabellennamen die Feldnamen auslesen. Zwar wird anhand der Auflistungen korrekt angegeben, wie viele Felder sich darin befinden, allerdings stehen dort nicht die Namen!


Der PHP-Code:
PHP:
function readOldDB($oldDB)
{
  // VERBINDUNG zur ALTEN Datenbank herstellen
  mysql_connect("HOST", "USER" ,"PASSWORD") or die ("Keine Verbindung moeglich");
  mysql_select_db($oldDB) or die ("Die Datenbank existiert nicht");
 
 
  // TABELLEN der Datenbank auslesen und ausgeben
  $sql = "SHOW TABLES FROM $oldDB";
  $re=mysql_query($sql);
 
  if(!$re)
  {
   echo 'Datenkbank konnte die Tabellennamen nicht auslesen!';
  }
  else
  {
   $i = 1;
   while($row = mysql_fetch_row($re))
   {
    $tables[$i] = $row[0];
    $i++;
   }
  }
  $num = 1;
  echo 'TABELLEN:<br /><br />';
  // TABELLEN inkl. Felder ausgeben
  foreach($tables as $name)
  {
   echo $name.'<br />';
 
##########HIER BEGINNT DAS PROBLEM##########
 
   // FELDER der Tabelle auslesen und ausgeben
   $sql2 = "SHOW COLUMNS FROM $tables[$num]";
   $re2 = mysql_query($sql2);
 
   if(!re2)
   {
    echo 'Die Datenbank konnte die Feldnamen nicht auslesen!';
   }
   else
   {
    $i2 = 1;
 
    while($field = mysql_fetch_row($re2))
    {
     $fields[$i2] = $row2[0];
     $i2++;
    }
   }
 
   // FELDER inkl. Daten ausgeben
   foreach($fields as $name2)
   {
    echo '<li>'.$name2.'<br />';
   }
   echo '<br />';
 
##########HIER ENDET DAS PROBLEM##########
 
  }
}

So sieht das Ergebnis aus (jede Tabelle besitzt 4 Felder):

Ich hoffe, dass ihr mir da helfen könnt. Ich hab schon überall (ja Google kenne ich ^^) nachgeschaut, aber irgendwie gibt es hier und dort immer leichte Probleme mit SHOW COLUMNS/FIELDS, aber mein Problem wird nirgends konkret angesprochen.
 

AW: Datenbank in Einzelteile zerlegen

Ahhh, hab den Fehler gefunden (es sieht vielleicht aus, als hab ich die Lösung schnell gefunden, aber ich hab da jetzt ein paar Stunden dran verbracht.. -.-):


Das war der Code vorher...
PHP:
    while($field = mysql_fetch_row($re2))
    {
     $fields[$i2] = $row2[0];
     $i2++;
    }

...in der While-Bedingung steht die Variable $field und die wird hinterher gar nicht mehr aufgegriffen bzw. das Array $row2 wird vorher nirgends mit Inhalt gefüllt. ^^

PHP:
    while($row2 = mysql_fetch_row($re2))
    {
     $fields[$i2] = $row2[0];
     $i2++;
    }

Also waren nur die Variablennamen falsch...^^"

Jetzt geht es.



 

mommel

mv dau /dev/null

AW: Datenbank in Einzelteile zerlegen

îch würde fetch_assoc nehmen da du dann die kompletten werte mit benannten keys in einem array hast
 
AW: Datenbank in Einzelteile zerlegen

Ah jetzt hab ich aber doch ncohmal ne Frage:

Ich muss auch an alle Details wie collation, type, length etc rankommen.
Dafür gibt es ja diverse SHOW-Befehle.

Und im Internet habe ich für SHOW TABLES STATUS folgendes gefunden:

PHP:
  $sql = "SHOW TABLE STATUS FROM $value";
  $result = mysql_query($sql);
  while($zeile=mysql_fetch_array($result)) 
  {
   echo "Tabelle: ". $zeile ["Name"] . " / DATA: ". $zeile ["Data_length"] . "Byte / Rows : ". $zeile["Rows"] ."<br>";
  }

Bei mir zeigt er allerdings einen Fehler in der "while"-Zeile an. Er kann anscheinend daraus kein Array erstellen. :(

mysql_fetch_array(): supplied argument is not a valid MySQL result resource


Oder kennt jemand eine andere Methode um an die ganzen Daten und Inhalte/Werte einer Tabelle zu kommen, mit denen ich dann hinterher eine neue Tabelle erstellen kann?
 

mommel

mv dau /dev/null

AW: Datenbank in Einzelteile zerlegen

Also entweder hast du $value nicht gefüllt oder dein PHP hat nen Problem damit das du die Variable in den " hast, kann vorkommen muss aber nicht.

PHP:
$sql = "SHOW TABLE STATUS FROM ".$value;
$result = mysql_query($sql);
if(mysql_error())
{
 die($sql.'<br />'.mysql_error());
}

Schreib mal die Ausgabe des mysqlerror mit rein das bringt bei sowas Klarheit.

Ich hab deinen Code getestet sollte laufen drum wirds wohl auch nur am $value liegen.
 
AW: Datenbank in Einzelteile zerlegen

Ich hab jetzt nen anderen Code-Schnipsel eingefügt:

PHP:
  $result = mysql_query("SHOW CREATE TABLE $value") or die("Tabelle nicht gefunden");
  $createtable = mysql_result($result, 0, 1).'C&U&T';
  //echo $createtable.'<br /><br />';
  $list = explode('C&U&T', $createtable);
  for($x=0;$x<count($list);$x++)
  {
   echo $list[$x].'<br />';
  }

Hier ist mysql_result sehr hilfreich, weil dann die -kompletten- CREATE TABLE Informationen ausgegeben werden, wie die Tabelle erstellt wurde. :)


EDIT:
Jetzt tut sich aber wieder eine neue Frage auf:
Wie kann ich diese Strings (CREATE TABLE blabla) verwenden um diese erhaltenen Tabellen in eine neue (andere) Datenbank einzufügen?

Muss ich dazu erst die Verbindung zu einer neuen Datenbank aufnehmen (sie exisitiert bereits, nur ohne Einträge) und dann diese CREATE-Strings ausgeben?
 
Zuletzt bearbeitet:

mommel

mv dau /dev/null

AW: Datenbank in Einzelteile zerlegen

EDIT:
Jetzt tut sich aber wieder eine neue Frage auf:
Wie kann ich diese Strings (CREATE TABLE blabla) verwenden um diese erhaltenen Tabellen in eine neue (andere) Datenbank einzufügen?

Muss ich dazu erst die Verbindung zu einer neuen Datenbank aufnehmen (sie exisitiert bereits, nur ohne Einträge) und dann diese CREATE-Strings ausgeben?
Am besten packst du die ganze Datenbankverbindungsgeschichte in eine Klasse und sprichst damit dann 2 DBs an und liest aus der einen und schiebsts in die andere is normalerweise kein allzugroßes Problem
 

BlackScorp

I Code for Food:D

AW: Datenbank in Einzelteile zerlegen

eigentlich braucht man das nicht mit klassen und co.

einfach
PHP:
mysql_select_db($ersteDatenbank);
//komische sachen machen und das Create Table generieren
mysql_select_db($zweiteDatenbank);
mysql_query($generiertestCreateTabelEinfügen);
mysql_query($generierteINSERTSeinfügen);
 

mommel

mv dau /dev/null

AW: Datenbank in Einzelteile zerlegen

Man nimmt Klassen damit es nicht zu Fehlern kommt, das man doch noch in der ersten DB hängt etc. pp

Und ne DB Klasse ist schon kein Hexenwerk oder?
PHP:
class mysql
{
    var $link;
    var $result;
    var $error;


    function mysql($db_host,$db_user,$db_pass,$db_database)
    {
        $this->link    =    mysql_connect($db_host,$db_user,$db_pass);
        mysql_select_db($db_database,$this->link);
    }

    function query($query) {
        $this->result= mysql_query($query,$this->link);
        return $this->result;
    }
     
    function fetch($result) {
        while ($row=mysql_fetch_array($result))
        return $row;
    }
}

$db            =    new mysql($db_host,$db_user,$db_pass,$db_database);
$db2            =    new mysql($db_host2,$db_user2,$db_pass2,$db_database2);
und dann $db-> oder $db2 anzusprechen ist dann um einiges schöner
dann kannste es ja wenigstens direkt in deinem sql Statement verbacken.
 
AW: Datenbank in Einzelteile zerlegen

PHP:
mysql_select_db($ersteDatenbank);
//komische sachen machen und das Create Table generieren
mysql_select_db($zweiteDatenbank);
mysql_query($generiertestCreateTabelEinfügen);
mysql_query($generierteINSERTSeinfügen);

Danke, das hat mir weitergeholfen, aber das INSERT brauchte ich irgendwie nicht, oder stimmt da etwas dann nicht? Es funktioniert nämlich soweit.

PHP:
function readDB($oldDB, $newDB)
{
 // VERBINDUNG ZUM SERVER
 mysql_connect("HOST", "USER", "PASSWORD") or die ("Verbindung fehlgeschlagen!");
 
 // Verbindung zur alten Datenbank ($oldDB) // Tabellennamen in Variable schreiben
 $db1 = mysql_select_db($oldDB) or die ("Die Datenbank konnte nicht gefunden werden!");
 $sqlTables = "SHOW TABLES FROM $oldDB";
 $resultTables = mysql_query($sqlTables);
 $i=0;
 while($row = mysql_fetch_array($resultTables))
 {
  $tables[$i] = $row[0];
  $i++;
 }
 // Tabelleninformationen mit Hilfe der Tabellennamen aus $tables in Array $list eintragen
 $num=0;
 foreach($tables as $value)
 {
  // Tabellen aus alter Datenbank auslesen
  $result = mysql_query("SHOW CREATE TABLE $value") or die("Tabelle nicht gefunden");
  $createtable = mysql_result($result, 0, 1);
  $list[$num] = $createtable;  
 
  // Tabellen aus alter DB in neue DB eintragen
  $db2 = mysql_select_db($newDB) or die ("Die Datenbank konnte nicht gefunden werden!");
  $sql = mysql_query($list[$num]);
  // Tabellen aus alter DB löschen
  $db1 = mysql_select_db($oldDB) or die ("Die Datenbank konnte nicht gefunden werden!");
  $sqlDel = "DROP TABLE $value";
  $queryDel = mysql_query($sqlDel);   
 
  $num++;
 }
 echo 'Dateien erfolgreich exportiert';
 
 
}
 
AW: Datenbank in Einzelteile zerlegen

Ich habe jetzt folgenden INSERT-Code generiert.

PHP:
INSERT INTO `hp` (`id`, `site`, `url`, `linktext`, `comment`) VALUES ( 1, `GMX`, `http://www.gmx.de`, `www.gmx.de`, ), ( 2, `Lala`, `http://www.lala.de`, `www.lala.de`, `Nonsense`), ( 3, `Google`, `http://www.google.de`, `www.google.de`, `Suchmaschine`);

Kann ich ihn jetzt so einfügen (der Code steht in der Variable $insert)?

PHP:
$sql = mysql_query($insert);

Oder wie funktioniert das genau?
 
AW: Datenbank in Einzelteile zerlegen

Ah gelöst: Es lag an den Anführungszeichen.
Hatte ausschließlich ` verwendet, dabei muss bei den VALUES ' stehen.

EDIT: Theoretisch kann ein Mod den Thread als gelöst markieren.
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben