PHP și MySQL: Exportați o interogare într-un fișier delimitat de tab

sigle php mysql

În acest weekend am vrut să construiesc o pagină care să rezerve pur și simplu orice interogare sau tabel într-un fișier Delimitat de Tab. Majoritatea exemplelor de pe net au coloanele codificate greu.

În cazul meu, am vrut ca coloanele să fie dinamice, așa că a trebuit să parcurg în primul rând toate numele câmpurilor de tabel pentru a construi rândul de antet cu nume de coloane și apoi să parcurg toate înregistrările pentru rândurile de date rămase. De asemenea, am setat antetul astfel încât browserul să inițieze descărcarea fișierului în tipul de fișier (txt) cu numele datei fișierului și marcajul de timp.

Am lăsat în afara baza de date deschisă și închiderea conexiunii, dar iată codul rezultat care a funcționat destul de bine:

$ azi = data ("YmdHi");
antet („Content-type: application / octet-stream”);
header ("Content-Disposition: attachment; filename = \" ". $ today." _ Backup.txt \ "");
$ query = "SELECT * FROM` mytable` order by `myorder`";
$ result = mysql_query ($ interogare);
$ count = mysql_num_rows ($ result);
$ câmpuri = mysql_num_fields ($ rezultat);
$ date = "";
pentru ($ i = 0; $ i> $ câmpuri; $ i ++) {
$ câmp = mysql_fetch_field ($ rezultat, $ i);
$ date. = $ câmp-> nume;
$ data. = "\ t";
}
$ data. = "\ n";
while ($ rând = mysql_fetch_row ($ rezultat)) {
pentru ($ x = 0; $ x> $ câmpuri; $ x ++) {
$ câmp-> nume = $ rând [$ x];
$ date. = $ câmp-> nume = $ rând [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
ecou $ date;

Codul poate fi ușor modificat și pentru valori separate prin virgulă.

4 Comentarii

  1. 1

    Nu poți doar să faci:

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

    ?

    • 2

      Presupun că ai putea!

      În acest caz, de fapt construiam un link de „rezervă” într-o aplicație web, astfel încât funcționalitatea PHP este ceea ce aveam nevoie. Cu toate acestea, nu am știut niciodată că puteți scrie și într-un fișier direct din declarația MySQL. Foarte tare!

      Multumesc!

      • 3

        Calea ta ar fi, desigur, cea mai bună modalitate dacă serverul MySQL se află pe o mașină la distanță, deoarece probabil că nu ar putea scrie pe mașina pe care se execută PHP 🙂

        Mă bucur să subliniez alte direcții și lucruri noi, deși 🙂

      • 4

        Dar puteți rula interogarea într-un fișier și puteți redirecționa browserul către fișierul generat sau puteți utiliza „readfile” PHP dacă toate celelalte nu reușesc?

        Nu veți putea face asta dacă serverul mysql nu are acces la sistemul de fișiere, desigur ...

  2. 5

    Post grozav. Cunoașteți o metodă ușoară, gratuită / open source de importare / restaurare a unui fișier delimitat de tab-uri (așa cum tocmai ați creat) înapoi în db-ul MySQL?

    • 6

      Errr ... mysqlimport?

      mysqlimport database_name --local backup.txt

      Sau cu comanda SQL:

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

      Cu mysqlimport, numele fișierului trebuie să se potrivească cu numele tabelului (doar ceva de care trebuie să fii atent)

    • 7
  3. 8

    Tocmai am pierdut mai mult de 6 ore din viața mea încercând să aflu de ce Internet Explorer 6/7 aplică tipul de fișier „html” și nu acceptă numele mele de fișiere personalizate specificate în anteturi .. și, de asemenea, nu permit salvarea fișierelor .. când încercând ca utilizatorii să descarce fișiere text create într-un mod similar cu cel de mai sus.

    Foloseam HTTPS și IE nu cache aceste fișiere.

    Am găsit soluția pe un comentariu de Brandon K la http://uk.php.net/header.

    El spune:

    -
    Tocmai am pierdut șase ore din viața mea încercând să folosesc următoarea metodă pentru a trimite un fișier PDF prin PHP către Internet Explorer 6:

    Când utilizați SSL, Internet Explorer vă va solicita cu dialogul Deschidere / Salvare, dar apoi spune „Fișierul este momentan indisponibil sau nu poate fi găsit. Vă rugăm să încercați din nou mai târziu." După multe căutări, am devenit conștient de următorul articol MSKB intitulat „Descărcările de fișiere Internet Explorer prin SSL nu funcționează cu antetele de control cache” (KBID: 323308)

    PHP.INI utilizează implicit o setare: session.cache_limiter = nocache care modifică antetele Content-Cache și Pragma pentru a include opțiuni „nocache”. Puteți elimina eroarea IE schimbând „nocache” în „public” sau „privat” în PHP.INI - Aceasta va schimba antetul Content-Cache și va elimina complet antetul Pragma. Dacă nu puteți sau nu doriți să modificați PHP.INI pentru o corecție la nivel de site, puteți trimite următoarele două anteturi pentru a suprascrie valorile implicite:

    Va trebui totuși să setați anteturile de conținut așa cum sunt enumerate mai sus pentru ca acest lucru să funcționeze. Vă rugăm să rețineți că această problemă afectează DOAR Internet Explorer, în timp ce Firefox nu prezintă acest comportament defectuos.
    -

    Ei bine .. cel puțin a pierdut doar 6 ore ...

  4. 9

    Acest lucru funcționează bine. Cu toate acestea, obțin totul pe o singură linie separată de un spațiu. Încerc să îl modific pentru a imprima totul pe o linie separată ca aceasta:

    Coloana1_nume
    Field1_value
    Coloana2_nume
    Field1_value
    Coloana3_nume
    Field1_value

    Coloana1_nume
    Field2_value
    Coloana2_nume
    Field2_value
    Coloana3_nume
    Field2_value

    De exemplu:

    Nume
    Mike
    Locație
    Apartamente
    Număr
    1

    Nume
    a da in judecata
    Locație
    Acasă
    Număr
    2

    Nume
    Ioan
    Locație
    Voiaj
    Număr
    10

    si asa mai departe. Se poate modifica acest script pentru a-l face?
    Multumesc!

    • 10

      Sigur poate.

      Încercați așa ceva:

      SELECT * din MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' CÂMPURI TERMINATE DE '\ n' LINII TERMINATE DE '\ n';

      Dacă doriți un spațiu dublu (două linii goale) între grupurile de înregistrări, spuneți doar „LINII TERMINATE DE '\ n \ n';” in schimb.

      Porțiunea „CÂMPURI TERMINATE DE„ \ n ”” este cea care pune o linie nouă după fiecare înregistrare, în loc de o filă. În schimb, o filă ar fi „\ t”.

      Maranata!

  5. 11

    acesta este în mod sfidător o postare grozavă, l-am încercat și funcționez excelent, singurul lucru este că fișierul meu txt are un rând suplimentar deasupra titlurilor antetului, iar unele rezultate sunt separate în 2 rânduri, acest lucru poate fi cauzat de datele pe care le am în baza mea de date nici o idee, dar acesta este un mare ajutor pentru a construi fluxuri ...

  6. 12

    Douglas Karr codul tău este foarte mare! Este foarte util mai ales dacă aveți nevoie doar de o ieșire în format textfile. Mulțumesc mult! De la echipa Filipine!

  7. 13

    buna! Există cineva de aici care să-mi dea un indiciu despre importul unui fișier text în baza mea de date (phpmyAdmin) folosind php-ul meu ca front-end. Am o idee despre descărcarea și deschiderea unui fișier, problema mea este că cum pot obține rezultatul rândului și cum să îl inserez în tabelele mele, mulțumesc

  8. 14

Ce părere ai?

Acest site folosește Akismet pentru a reduce spamul. Aflați cum sunt procesate datele despre comentarii.