PHP und MySQL: Exportieren Sie eine Abfrage in eine tabulatorgetrennte Datei

MySQL PHP Logos

Dieses Wochenende wollte ich eine Seite erstellen, die einfach jede Abfrage oder Tabelle in einer durch Tabulatoren getrennten Datei sichert. Bei den meisten Beispielen im Internet sind die Spalten fest codiert.

In meinem Fall wollte ich, dass die Spalten dynamisch sind, also musste ich zuerst alle Tabellenfeldnamen durchlaufen, um die Kopfzeile mit Spaltennamen zu erstellen, und dann alle Datensätze für die verbleibenden Datenzeilen durchlaufen. Ich habe auch den Header so eingestellt, dass der Browser den Dateidownload im Dateityp (txt) mit dem Namen des Dateidatums und dem Zeitstempel initiiert.

Ich habe die offene und schließende Verbindung der Datenbank weggelassen, aber hier ist der resultierende Code, der ganz gut funktioniert hat:

$ today = date ("YmdHi");
Header ("Inhaltstyp: Anwendung / Oktett-Stream");
Header ("Content-Disposition: Anhang; Dateiname =". $ today. "_ Backup.txt" ");
$ query = "SELECT * FROM` mytable` order by` myorder` ";
$ result = mysql_query ($ query);
$ count = mysql_num_rows ($ result);
$ fields = mysql_num_fields ($ result);
$ data = "";
für ($ i = 0; $ i> $ Felder; $ i ++) {
$ field = mysql_fetch_field ($ result, $ i);
$ data. = $ field-> name;
$ data. = "\ t";
}
$ data. = "\ n";
while ($ row = mysql_fetch_row ($ result)) {
für ($ x = 0; $ x> $ Felder; $ x ++) {
$ field-> name = $ row [$ x];
$ data. = $ field-> name = $ row [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
echo $ data;

Der Code kann auch für durch Kommas getrennte Werte leicht geändert werden.

14 Kommentare

  1. 1

    Kannst du nicht einfach tun:

    SELECT `mytable` order by `myorder`
    INTO OUTFILE '/tmp/Backup.txt'
    FIELDS TERMINATED BY '\t'
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'

    ?

    • 2

      Ich nehme an, du könntest!

      In diesem Fall habe ich tatsächlich einen 'Backup'-Link in einer Webanwendung erstellt, sodass die PHP-Funktionalität genau das ist, was ich brauchte. Ich wusste jedoch nie, dass Sie auch direkt aus der MySQL-Anweisung in eine Datei schreiben können. Sehr cool!

      Vielen Dank!

      • 3

        Ihr Weg wäre natürlich der beste, wenn sich der MySQL-Server auf einem Remote-Computer befindet, da er wahrscheinlich nicht auf den Computer schreiben kann, auf dem PHP ausgeführt wird 🙂

        Ich bin froh, andere Richtungen und neue Dinge aufzuzeigen 🙂

      • 4

        Aber Sie könnten einfach die Abfrage in eine Datei ausführen und den Browser einfach in die generierte Datei umleiten oder die "Readfile" von PHP verwenden, wenn alles andere fehlschlägt?

        Das können Sie natürlich nicht, wenn der MySQL-Server keinen Zugriff auf das Dateisystem hat…

  2. 5

    Guter Eintrag. Kennen Sie eine einfache, kostenlose / Open-Source-Methode zum Importieren / Wiederherstellen einer durch Tabulatoren getrennten Datei (wie Sie sie gerade erstellt haben) zurück in die MySQL-Datenbank?

    • 6

      Ähm ... mysqlimport?

      mysqlimport database_name --local backup.txt

      Oder mit dem SQL-Befehl:

      LOAD DATA LOCAL INFILE 'backup.txt' INTO TABLE `my_table` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'

      Bei mysqlimport muss der Dateiname mit dem Tabellennamen übereinstimmen (nur etwas, auf das Sie achten müssen)

    • 7
  3. 8

    Ich habe gerade mehr als 6 Stunden meines Lebens verloren, als ich herausgefunden habe, warum Internet Explorer 6/7 den Dateityp 'html' angewendet hat und meine in den Headern angegebenen benutzerdefinierten Dateinamen nicht akzeptiert hat. Außerdem konnte ich nicht zulassen, dass Dateien gespeichert werden. Wann Der Versuch, Benutzer dazu zu bringen, Textdateien herunterzuladen, die auf ähnliche Weise wie oben erstellt wurden.

    Ich habe HTTPS verwendet und der IE speichert diese Dateien nicht zwischen.

    Ich fand die Lösung in einem Kommentar von Brandon K unter http://uk.php.net/header.

    Er sagt:

    -
    Ich habe gerade sechs Stunden meines Lebens verloren, als ich versucht habe, mit der folgenden Methode eine PDF-Datei über PHP an Internet Explorer 6 zu senden:

    Bei Verwendung von SSL fordert Internet Explorer das Dialogfeld Öffnen / Speichern auf, sagt dann jedoch: „Die Datei ist derzeit nicht verfügbar oder kann nicht gefunden werden. Bitte versuchen Sie es später noch einmal. " Nach langem Suchen wurde ich auf den folgenden MSKB-Artikel mit dem Titel "Internet Explorer-Dateidownloads über SSL funktionieren nicht mit den Cache-Steuerelement-Headern" (KBID: 323308) aufmerksam.

    PHP.INI verwendet standardmäßig eine Einstellung: session.cache_limiter = nocache, die Content-Cache- und Pragma-Header so ändert, dass sie "Nocache" -Optionen enthalten. Sie können den IE-Fehler beseitigen, indem Sie in PHP.INI "nocache" in "public" oder "private" ändern. Dadurch wird der Content-Cache-Header geändert und der Pragma-Header vollständig entfernt. Wenn Sie PHP.INI für einen Site-weiten Fix nicht ändern können oder möchten, können Sie die folgenden zwei Header senden, um die Standardeinstellungen zu überschreiben:

    Sie müssen weiterhin die oben aufgeführten Inhaltsheader festlegen, damit dies funktioniert. Bitte beachten Sie, dass dieses Problem NUR den Internet Explorer betrifft, während Firefox dieses fehlerhafte Verhalten nicht aufweist.
    -

    Na ja ... zumindest hat er nur 6 Stunden verloren ...

  4. 9

    Das funktioniert gut. Ich bekomme jedoch nur alles in einer Zeile, die durch ein Leerzeichen getrennt ist. Ich versuche es zu ändern, um alles in einer separaten Zeile wie folgt zu drucken:

    Spalte1_name
    Feld1_Wert
    Spalte2_name
    Feld1_Wert
    Spalte3_name
    Feld1_Wert

    Spalte1_name
    Feld2_Wert
    Spalte2_name
    Feld2_Wert
    Spalte3_name
    Feld2_Wert

    Beispielsweise:

    Name
    Mike
    Ort
    Arbeit
    Nummer
    1

    Name
    Verklagen
    Ort
    Home
    Nummer
    2

    Name
    John
    Ort
    Reise
    Nummer
    10

    und so weiter. Kann dieses Skript dazu geändert werden?
    Vielen Dank!

    • 10

      Sicher kann.

      Versuchen Sie so etwas:

      SELECT * from MyTableName IN OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' FELDER BEENDET VON '\ n' LINIEN BEENDET VON '\ n';

      Wenn Sie ein doppeltes Leerzeichen (zwei leere Zeilen) zwischen Datensatzgruppen wünschen, sagen Sie einfach "LINES TERMINATED BY '\ n \ n';" stattdessen.

      Der Abschnitt "FELDER BEENDET VON '\ n'" setzt eine neue Zeile nach jedem Datensatz anstelle einer Registerkarte. Ein Tab wäre stattdessen '\ t'.

      Maranatha!

  5. 11

    Dies ist trotzig ein großartiger Beitrag. Ich habe es versucht und arbeite großartig. Das einzige ist, dass meine txt-Datei eine zusätzliche Zeile über den Headertiteln hat und einige Ergebnisse in zwei Zeilen unterteilt sind. Dies kann an den Daten liegen, die ich habe in meiner Datenbank keine Ahnung, aber dies ist eine große Hilfe beim Erstellen von Feeds ...

  6. 12

    Douglas Karr Ihr Code rockt wirklich! Dies ist besonders dann sehr nützlich, wenn Sie nur eine Ausgabe im Textdateiformat benötigen. Vielen Dank! Vom Team Philippinen!

  7. 13

    Sie da! Gibt es jemanden von hier, der mir einen Hinweis zum Importieren einer Textdatei in meine Datenbank (phpmyAdmin) mit meinem PHP als Frontend geben kann? Ich habe eine Idee zum Herunterladen und Öffnen einer Datei. Mein Problem ist, wie ich das Zeilenergebnis erhalten und in meine Tabellen einfügen kann, danke

  8. 14

Was denken Sie?

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahren Sie, wie Ihre Kommentardaten verarbeitet werden.