PHP e MySQL: esporta una query in un file delimitato da tabulazioni

loghi mysql php

Questo fine settimana volevo creare una pagina che eseguisse semplicemente il backup di qualsiasi query o tabella in un file delimitato da tabulazioni. La maggior parte degli esempi in rete hanno le colonne codificate.

Nel mio caso, volevo che le colonne fossero dinamiche, quindi ho dovuto prima scorrere tutti i nomi dei campi della tabella per creare la riga di intestazione con i nomi delle colonne, quindi scorrere tutti i record per le righe di dati rimanenti. Ho anche impostato l'intestazione in modo che il browser avvii il download del file nel tipo di file (txt) con il nome della data del file e il timestamp.

Ho lasciato il database aperto e chiuso la connessione, ma ecco il codice risultante che ha funzionato abbastanza bene:

$ oggi = data ("YmdHi");
header ("Content-type: application / octet-stream");
header ("Content-Disposition: attachment; filename = \" ". $ today." _ Backup.txt \ "");
$ query = "SELEZIONA * DA` mytable` order by `myorder`";
$ risultato = mysql_query ($ query);
$ count = mysql_num_rows ($ risultato);
$ campi = mysql_num_fields ($ risultato);
$ data = "";
for ($ i = 0; $ i> $ campi; $ i ++) {
$ campo = mysql_fetch_field ($ risultato, $ i);
$ dati. = $ campo-> nome;
$ data. = "\ t";
}
$ data. = "\ n";
while ($ riga = mysql_fetch_row ($ risultato)) {
for ($ x = 0; $ x> $ campi; $ x ++) {
$ campo-> nome = $ riga [$ x];
$ dati. = $ campo-> nome = $ riga [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
echo $ dati;

Il codice può essere facilmente modificato anche per valori separati da virgole.

Commenti

  1. 1

    Non puoi semplicemente fare:

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

    ?

    • 2

      Suppongo che potresti!

      In questo caso, stavo effettivamente creando un collegamento di "backup" in un'applicazione web, quindi la funzionalità PHP è ciò di cui avevo bisogno. Tuttavia, non ho mai saputo che potresti anche scrivere su un file direttamente dall'istruzione MySQL. Molto bello!

      Grazie!

      • 3

        Il tuo modo sarebbe ovviamente il modo migliore se il server MySQL si trova su una macchina remota, poiché probabilmente non sarebbe in grado di scrivere sulla macchina su cui è in esecuzione PHP 🙂

        Sono contento di indicare altre direzioni e cose nuove però 🙂

      • 4

        Ma potresti semplicemente eseguire la query su un file e reindirizzare il browser al file generato, o usare il "readfile" di PHP se tutto il resto fallisce?

        Non sarai in grado di farlo se il server mysql non ha accesso al filesystem ovviamente ...

  2. 5

    Ottimo post. Conosci un metodo semplice, gratuito / open source per importare / ripristinare un file delimitato da tabulazioni (come hai appena creato) nel database mysql?

    • 6

      Errr ... mysqlimport?

      mysqlimport database_name --local backup.txt

      O con il comando SQL:

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

      Con mysqlimport, il nome del file deve corrispondere al nome della tabella (solo qualcosa a cui prestare attenzione)

    • 7
  3. 8

    Ho appena perso più di 6 ore della mia vita cercando di capire perché Internet Explorer 6/7 applicava il tipo di file "html" e non accettava i miei nomi di file personalizzati specificati nelle intestazioni .. e inoltre non permetteva il salvataggio dei file .. quando tentare di far scaricare agli utenti file di testo creati in modo simile a quello sopra.

    Stavo usando HTTPS e IE non memorizza nella cache questi file.

    Ho trovato la soluzione su un commento di Brandon K su http://uk.php.net/header.

    Egli dice:

    -
    Ho appena perso sei ore della mia vita cercando di utilizzare il seguente metodo per inviare un file PDF tramite PHP a Internet Explorer 6:

    Quando si utilizza SSL, Internet Explorer chiederà con la finestra di dialogo Apri / Salva, ma poi dirà "Il file non è attualmente disponibile o non può essere trovato. Per favore riprova più tardi." Dopo molte ricerche sono venuto a conoscenza del seguente articolo MSKB intitolato "I download di file di Internet Explorer su SSL non funzionano con le intestazioni di controllo della cache" (KBID: 323308)

    PHP.INI per impostazione predefinita utilizza un'impostazione: session.cache_limiter = nocache che modifica le intestazioni Content-Cache e Pragma per includere le opzioni "nocache". Puoi eliminare l'errore di IE cambiando "nocache" in "pubblico" o "privato" in PHP.INI - Questo cambierà l'intestazione Content-Cache e rimuoverà completamente l'intestazione Pragma. Se non puoi o non vuoi modificare PHP.INI per una correzione a livello di sito, puoi inviare le seguenti due intestazioni per sovrascrivere i valori predefiniti:

    Sarà comunque necessario impostare le intestazioni dei contenuti come elencato sopra affinché funzioni. Tieni presente che questo problema riguarda SOLO Internet Explorer, mentre Firefox non mostra questo comportamento difettoso.
    -

    Beh ... almeno ha perso solo 6 ore ...

  4. 9

    Funziona bene. Tuttavia, ottengo tutto su una riga separata da uno spazio. Sto cercando di modificarlo per stampare tutto su una riga separata come questa:

    Colonna1_nome
    Campo1_valore
    Colonna2_nome
    Campo1_valore
    Colonna3_nome
    Campo1_valore

    Colonna1_nome
    Campo2_valore
    Colonna2_nome
    Campo2_valore
    Colonna3_nome
    Campo2_valore

    Per esempio:

    Nome
    Mike
    Posizione
    Work
    Numero
    1

    Nome
    Citare in giudizio
    Posizione
    Casa
    Numero
    2

    Nome
    John
    Posizione
    Viaggi
    Numero
    10

    e così via. Questo script può essere modificato per farlo?
    Grazie!

    • 10

      Certo che si può.

      Prova qualcosa di simile:

      SELEZIONA * da MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' CAMPI TERMINATI DA '\ n' LINEE TERMINATE DA '\ n';

      Se desideri un doppio spazio (due righe vuote) tra i gruppi di record, dì semplicemente "LINEE TERMINATE DA '\ n \ n';" anziché.

      La parte "CAMPI TERMINATI DA '\ n'" è ciò che inserisce una nuova riga dopo ogni record, invece di una tabulazione. Una scheda sarebbe invece "\ t".

      Maranatha!

  5. 11

    questo è decisamente un ottimo post, l'ho provato e funziona alla grande, l'unica cosa è che il mio file txt ha una riga in più sopra i titoli delle intestazioni, e alcuni risultati sono stati separati in 2 righe, ciò potrebbe essere dovuto ai dati che ho nel mio database non ne ho idea, ma questo è di grande aiuto per creare feed ...

  6. 12

    Douglas Karr il tuo codice è davvero eccezionale! È molto utile specialmente se hai solo bisogno di un output in formato file di testo. Molte grazie! Dal team Filippine!

  7. 13

    Ehilà! C'è qualcuno da qui che può darmi un suggerimento sull'importazione di un file di testo nel mio database (phpmyAdmin) usando il mio php come front-end. Ho un'idea su come scaricare un file e aprirlo, il mio problema è che come posso ottenere il risultato della riga e come inserirlo nelle mie tabelle, grazie

  8. 14

Cosa ne pensi?

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati dei tuoi commenti.