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

mysql php logotipi

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

U mom slučaju želio sam da stupci budu dinamični, pa sam prvo morao petljati kroz sva imena polja tablice da bih izgradio redak zaglavlja s imenima stupaca, a zatim petlju kroz sve zapise za preostale retke podataka. Također sam postavio zaglavlje tako da će preglednik 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 funkcionirao:

$ danas = datum ("YmdHi");
zaglavlje ("Vrsta sadržaja: aplikacija / oktet-tok");
zaglavlje ("Content-Disposition: privitak; 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 ($ result)) {
za ($ x = 0; $ x> $ polja; $ x ++) {
$ polje-> ime = $ redak [$ x];
$ podataka. = $ polje-> ime = $ redak [$ x];
$ podataka. = "\ t";
}
$ podataka. = "\ n";
}
echo $ podaci;

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

14 Komentari

  1. 1

    Zar ne možete jednostavno učiniti:

    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!

      U ovom sam slučaju zapravo stvarao vezu za sigurnosnu kopiju u web aplikaciji, tako da je PHP funkcionalnost ono što mi treba. Međutim, nikad nisam znao da možete i pisati u datoteku izravno iz MySQL izjave. Jako cool!

      Hvala!

      • 3

        Vaš bi način naravno bio najbolji način da je MySQL poslužitelj na udaljenom računalu, jer vjerojatno ne bi mogao pisati na stroj na kojem radi PHP 🙂

        Drago mi je upozoriti na druge upute i nove stvari 🙂

      • 4

        Ali možete jednostavno pokrenuti upit u datoteku i jednostavno preusmjeriti preglednik na generiranu datoteku ili koristiti PHP-ovu "datoteku za čitanje" ako sve drugo ne uspije?

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

  2. 5

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

    • 6

      Greška ... mysqlimport?

      mysqlimport database_name --local backup.txt

      Ili 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 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 dopušta spremanje datoteka .. kada pokušaj da korisnici preuzmu tekstualne datoteke stvorene na sličan način kao gore.

    Koristio sam HTTPS i IE ne pohranjuje te datoteke u predmemoriju.

    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:

    Kada upotrebljavate SSL, Internet Explorer će zatražiti dijalog Otvori / Spremi, ali zatim kaže „Datoteka je trenutno nedostupna ili je nije moguće pronaći. Molimo pokušajte ponovo kasnije." Nakon mnogo pretraživanja saznao sam za sljedeći članak MSKB-a pod naslovom „Preuzimanja datoteka programa Internet Explorer preko SSL-a ne rade s zaglavljima kontrole predmemorije“ (KBID: 323308)

    PHP.INI prema zadanim postavkama koristi postavku: session.cache_limiter = nocache koja mijenja zaglavlja Content-Cache i Pragma tako da uključuje opcije "nocache". Možete ukloniti IE pogrešku promjenom "nocache" u "public" ili "private" u PHP.INI - To će promijeniti zaglavlje Content-Cache, kao i potpuno ukloniti zaglavlje Pragma. Ako ne možete ili ne želite izmijeniti PHP.INI za popravak na cijeloj web lokaciji, možete poslati sljedeća dva zaglavlja da biste prepisali zadane postavke:

    I dalje ćete trebati postaviti zaglavlja sadržaja kako je gore navedeno kako bi ovo uspjelo. Imajte na umu da ovaj problem utječe SAMO na Internet Explorer, dok Firefox ne pokazuje ovo pogrešno ponašanje.
    -

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

  4. 9

    Ovo dobro djeluje. Međutim, sve dobijem samo na jednoj liniji odvojenoj razmakom. Pokušavam ga modificirati da bih sve ispisao u zasebnom retku, poput ovog:

    Stupac1_ime
    Polje1_vrijednost
    Stupac2_ime
    Polje1_vrijednost
    Stupac3_ime
    Polje1_vrijednost

    Stupac1_ime
    Polje2_vrijednost
    Stupac2_ime
    Polje2_vrijednost
    Stupac3_ime
    Polje2_vrijednost

    Na primjer:

    Ime i Prezime
    mikrofon
    Lokacija
    Raditi
    Broj
    1

    Ime i Prezime
    Suzana
    Lokacija
    Početna stranica
    Broj
    2

    Ime i Prezime
    Jovan
    Lokacija
    Putovati
    Broj
    10

    i tako dalje. Može li se ova skripta izmijeniti da to učini?
    Hvala!

    • 10

      Svakako može.

      Pokušajte otprilike ovako:

      ODABERI * 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.

      Dio "POLJA PREKINUTA '\ n'" ono je što stavlja novi redak nakon svakog zapisa, umjesto kartice. Kartica bi umjesto toga bila '\ t'.

      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š se kod stvarno ljulja! Vrlo je korisno posebno ako vam treba samo izlaz koji je u obliku tekstualne datoteke. Hvala puno! Od tima Filipini!

  7. 13

    hej tamo! Postoji li netko 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

Što vi mislite?

Ova web stranica koristi Akismet za smanjenje neželjene pošte. Saznajte kako se podaci vašeg komentara obrađuju.