Mit phpmyadmin alle Tabellen einzeln sichern

xtramen01

Erfahrenes Mitglied
Hallo Leute,
mit phpmyadmin kann man ja die Tabellen einer Datenbank schön als CSV Datei sichern.
Ich bräuchte jede Tabelle einzeln als CSV Datei. Das klappt auch super. Wenn man das öftrer machen muss, ist das aber sehr zeitintensiv.

Kennt jemand eine Möglichkeit wie man das komfortabel bewerkstelligen kann, ohne manuell jede Tabelle einzeln zu sichern?

Gruß und Danke.
 
Bin ich grad drann, danke :-)
Leider bekomme ich ein Out of memory Fehler.

Damit die CSV Datei so ist wie diese von phpmyadmin ausgegeben wird, brauche ich das so:

PHP:
  $dir = DIR_FS_DOCUMENT_ROOT . 'db_import';
  $sep = ';';


  $result = mysql_query("SELECT * FROM `products`");



  $i = 0;
  while ($i < mysql_num_fields($result)) {
     $feld = mysql_fetch_field($result, $i);
     $feld_array[] = '"' . $feld->name . '"';
     $i++;
  }

  $csv .= implode($sep, $feld_array).'<br />';


  while($row = mysql_fetch_row($result)) {

      //$csv .= '"'.implode($sep, $row).'"<br />';
      foreach($row as $spalte){
          $line[] = '"'.$spalte.'"';
      }

      $csv .= implode($sep, $line).'<br />';
  }


  echo $csv;


  //$textdatei = fopen ($dir, "w+"); /*a+ : 
  //fwrite($textdatei,$csv_data);
  //fclose($textdatei);


Und wenn ich es so mache, dann gibt es keinen Fehler:

PHP:
  $dir = DIR_FS_DOCUMENT_ROOT . 'db_import';
  $sep = ';';


  $result = mysql_query("SELECT * FROM `products`");



  $i = 0;
  while ($i < mysql_num_fields($result)) {
     $feld = mysql_fetch_field($result, $i);
     $feld_array[] = '"' . $feld->name . '"';
     $i++;
  }

  $csv .= implode($sep, $feld_array).'<br />';


  while($row = mysql_fetch_row($result)) {

      $csv .= '"'.implode($sep, $row).'"<br />';

  }


  echo $csv;


  //$textdatei = fopen ($dir, "w+"); /*a+ :
  //fwrite($textdatei,$csv_data); 
  //fclose($textdatei);

Hat jemand eine Idee was da falsch sein kann?
 
Beim ersetzen hast du vergessen am Anfang jeder Zeile $line zurückzusetzen. Dadurch wird $line[] mit jeder Zeile länger
PHP:
      //$line zurücksetzen
      $line = array();
      foreach($row as $spalte){
          $line[] = '"'.$spalte.'"';
      }

Am besten aber gleich den Dateizeiger öffnen und Zeile um Zeile rausschreiben - also gar nicht erst alles zwieschenspeichern. Mit fputcsv() musst du dich auch nicht mehr um die CSV-Ausgaben kümmern
PHP:
//Datei öffnen
$stream= fopen('meineDate.sql', 'w')
//Titelzeile ausgeben
fputcsv($stream, $feld_array, $sep);

//Die Resultate des Queries in die CSV-Datei schreiben
while($row = mysql_fetch_row($result)) {
	fputcsv($stream, $row, $sep);
  } 
//Datei schliessen
fclose($stream);
 
Danke ihr beiden! Habs nun mit fputcsv() gelöst und es ****t wunderbar. Danke!

Sorry für den Doppelpost.
Nach genauem hinschauen klappt es doch nicht richtig mit meinem Script.

Passt alles, bis auf die Spaltennamen. Also die erste Zeile.
Dort steht in jeder Datei dieselbe Zeile drin. Also jeweisl immer die der ersten Sicherung.
Also bei allen Sicherungen ist der Header derselbe. Hat jemand ne Idee?


PHP:
  $backup_dir   = 'neu/db_import/';
  $sep          = ';';



  $tables = mysql_query("SHOW TABLES");
  while($table = mysql_fetch_array($tables)){

    $tabelle = $table[0];
    $dir = $backup_dir . $tabelle . '.csv';

    $result = mysql_query("SELECT * FROM " . $tabelle . "");


    $fileHandler = fopen($dir, 'w+');

    //Titel-Zeile ausgeben
    while($field = mysql_fetch_field($result)){
        $header[] = $field->name;
    }

    fputcsv($fileHandler, $header, $sep, '"');

    //Daten ausgeben
    while($row = mysql_fetch_array($result)){
        fputcsv($fileHandler, $row, $sep, '"');
    }

    fclose($fileHandler);

 }

EDIT: Leider passen die Werte auch nicht zu den Spaltennamen :-(......Gibts doch nicht.

Gruß und Danke
 
Auch hier- Setz $header jeweis zurück. Du sammelst die Header aller Tabellen. Das heisst, bei der letzten Tabelle hast du die Hederflder aller Tabellen drin.

PHP:
    //Header zurücksetzen
    $header = array();
    //Titel-Zeile ausgeben
    while($field = mysql_fetch_field($result)){
        $header[] = $field->name;
    }
 
Ok super! Kleine Ursache große Wirkung :-)

Jetzt hab ich nur noch ein Problem.
Die Inhalte pasen nicht zum Header.
Die Inhalte stehen jeweils doppelt drin.
Also z.b.

Code:
header_1; header_2; header_3;

inhalt_1; inhalt_1; inhalt_2; inhalt_2; inhalt_3; inhalt_3;

Hast Du dazu noch eine Idee?

Gruß und echt herzlichen Dank für die Hilfe!
 
Klar doch.
Du verwendest mysql_fetch_array(). Das gibt die Daten als assoziatives und als numerisches Array aus
Code:
Array(
  1 => inhalt1
  feld1 => inhalt1
  2 => inhalt2
  feld2=>inhalt2
  ..
}

Verwende stattddessen mysql_fetch_row() wie du weitet oben schon mal hattest
 
Hurraaaa! Es klappt!
Ich verstehe das ehrlich gesagt noch nicht so ganz.

Ich versuchs mal:

Wenn ich mysql_fetch_array() benutze dann kann ich die Werte entweder mit $row['inhalt_1'] oder mit $row[1] ansprechen. Mit mysql_fetch_row() lediglich mit dem numerischen Wert oder?

Und wenn ich nun $row in einer Schleife ausgeben lasse, dann bekomme ich bei mysql_fetch_array() beide Werte geliefert?

Ist das so in etwas richtig? :-)

Gruß
 
Zurück