PHP i MySQL: Izvoz upita u datoteku s razgraničenim karticama

mysql php logotipi

Ovog vikenda želio sam napraviti stranicu koja će jednostavno sigurnosno kopirati bilo koji upit ili tablicu u datoteku s razdvojenim karticama. Većina primjera na mreži imaju stupce čvrsto kodirane.

U mom slučaju, želio sam da stupci budu dinamični, pa sam prvo morao provući petlju kroz sva imena polja tablice da bih izgradio redak zaglavlja s imenima stupaca, a zatim petlju kroz sve zapise za preostale retke podataka. Takođe sam postavio zaglavlje tako da će pregledač pokrenuti preuzimanje datoteke u tipu datoteke (txt) s imenom datuma datoteke i vremenskom oznakom.

Izostavio sam otvorenu i zatvaračku bazu podataka, ali evo rezultirajućeg koda koji je prilično dobro radio:

$ danas = datum ("YmdHi");
zaglavlje ("Tip sadržaja: aplikacija / oktet-tok");
zaglavlje ("Content-Disposition: prilog; ime datoteke = \" ". $ danas." _ Backup.txt \ "");
$ query = "SELECT * FROM` mytable` poredak po `myorder`";
$ rezultat = mysql_query ($ upit);
$ count = mysql_num_rows ($ rezultat);
$ polja = mysql_num_fields ($ rezultat);
$ podataka = "";
za ($ i = 0; $ i> $ polja; $ i ++) {
$ polje = mysql_fetch_field ($ rezultat, $ i);
$ podaci. = $ polje-> ime;
$ podataka. = "\ t";
}
$ podataka. = "\ n";
while ($ row = mysql_fetch_row ($ rezultat)) {
za ($ x = 0; $ x> $ polja; $ x ++) {
$ polje-> ime = $ red [$ x];
$ podaci. = $ polje-> ime = $ red [$ x];
$ podataka. = "\ t";
}
$ podataka. = "\ n";
}
echo $ data;

Kôd se može lako modificirati i za vrijednosti odvojene zarezom.

14 Komentari

  1. 1

    Zar ne možete jednostavno:

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

    ?

    • 2

      Pretpostavljam da biste mogli!

      In this case, I was actually building a ‘backup’ link in a web application, so the PHP functionality is what I needed. However, I never knew you could also write to a file directly from the MySQL statement. Very cool!

      Hvala!

      • 3

        Vaš način bi naravno bio najbolji način da je MySQL server na udaljenoj mašini, jer vjerovatno ne bi mogao pisati na mašinu na kojoj radi PHP 🙂

        Drago mi je ukazati na druge upute i nove stvari 🙂

      • 4

        Ali možete jednostavno pokrenuti upit za datoteku i jednostavno preusmjeriti pregledač na generiranu datoteku ili koristiti PHP-ov "readfile" ako sve drugo ne uspije?

        To nećete moći učiniti ako mysql poslužitelj naravno nema pristup datotečnom sistemu ...

  2. 5

    Sjajan post. Znate li jednostavnu, besplatnu / otvorenu metodu uvoza / vraćanja datoteke razdvojene karticama (kao što ste upravo kreirali) natrag u mysql db?

    • 6

      Errr… mysqlimport?

      mysqlimport database_name --local backup.txt

      Ili sa SQL naredbom:

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

      Uz mysqlimport, naziv datoteke mora odgovarati nazivu tablice (samo nešto na što treba paziti)

    • 7
  3. 8

    Upravo sam izgubio više od 6 sati svog života pokušavajući shvatiti zašto Internet Explorer 6/7 primjenjuje tip datoteke 'html' i ne prihvaća moja prilagođena imena datoteka navedena u zaglavljima .. a također ne dozvoljava spremanje datoteka .. kada pokušaj da korisnici preuzmu tekstualne datoteke stvorene na sličan način kao gore.

    Koristio sam HTTPS i IE ne kešira ove datoteke.

    Rješenje sam pronašao na komentaru Brandon K-a na http://uk.php.net/header.

    On kaže:

    -
    Upravo sam izgubio šest sati života pokušavajući koristiti sljedeću metodu za slanje PDF datoteke putem PHP-a u Internet Explorer 6:

    When using SSL, Internet Explorer will prompt with the Open / Save dialog, but then says “The file is currently unavailable or cannot be found. Please try again later.” After much searching I became aware of the following MSKB Article titled “Internet Explorer file downloads over SSL do not work with the cache control headers” (KBID: 323308)

    PHP.INI by default uses a setting: session.cache_limiter = nocache which modifies Content-Cache and Pragma headers to include “nocache” options. You can eliminate the IE error by changing “nocache” to “public” or “private” in PHP.INI — This will change the Content-Cache header as well as completely remove the Pragma header. If you cannot or do not want to modify PHP.INI for a site-wide fix, you can send the following two headers to overwrite defaults:

    You will still need to set the content headers as listed above for this to work. Please note this problem ONLY effects Internet Explorer, while Firefox does not exhibit this flawed behavior.
    -

    Pa .. barem je izgubio samo 6 sati ...

  4. 9

    This works well. However, I just get everything on one line separated by a space. I am trying to modify it to print everything on a separate line like this:

    Stupac1_ime
    Field1_value
    Stupac2_ime
    Field1_value
    Stupac3_ime
    Field1_value

    Stupac1_ime
    Field2_value
    Stupac2_ime
    Field2_value
    Stupac3_ime
    Field2_value

    Na primjer:

    Ime
    mikrofon
    lokacija
    rad
    broj
    1

    Ime
    tužiti
    lokacija
    POČETNA
    broj
    2

    Ime
    Jovan
    lokacija
    putovanje
    broj
    10

    and so on. Can this script be modified to do it?
    Hvala!

    • 10

      Naravno da mogu.

      Pokušajte otprilike ovako:

      SELECT * iz MyTableName U OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' POLJA PREKINUTA '\ n' LINIJE PRETVARANE '\ n';

      Ako želite dvostruki razmak (dva prazna retka) između grupa zapisa, samo recite „LINIJE PRETVARANE '\ n \ n';“ umjesto toga.

      The “FIELDS TERMINATED BY ‘\n'” portion is what puts a newline after each record, instead of a tab. A tab would be ‘\t’ instead.

      Maranatha!

  5. 11

    ovo je prkosno sjajan post, probao sam i sjajno funkcionira, jedino što moja txt datoteka ima dodatni redak iznad naslova zaglavlja, a neki su rezultati odvojeni u 2 reda, to mogu uzrokovati podaci koje imam u mojoj bazi podataka nemam pojma, ali ovo je odlična pomoć za izgradnju feedova ...

  6. 12

    Douglas Karr vaš kod se stvarno ljulja! Vrlo je korisno posebno ako vam treba samo izlaz koji je u formatu tekstualne datoteke. Hvala puno! Od tima Filipini!

  7. 13

    hej tamo! Postoji li neko odavde koji mi može dati savjet o uvozu tekstualne datoteke u moju bazu podataka (phpmyAdmin) koristeći moj php kao prednji kraj. Imam ideju o preuzimanju datoteke i njenom otvaranju, moj problem je u tome kako mogu dobiti rezultat retka i kako ga umetnuti u svoje tablice, hvala

  8. 14

Šta ti misliš?

Ova stranica koristi Akismet kako bi smanjila neželjenu poštu. Saznajte kako se podaci vašeg komentara obrađuju.