PHP og MySQL: Eksporter en forespørgsel til en fane-afgrænset fil

mysql php-logoer

I weekenden ønskede jeg at oprette en side, der simpelthen ville sikkerhedskopiere enhver forespørgsel eller tabel i en fane-afgrænset fil. De fleste eksempler på nettet har kolonnerne hårdkodede.

I mit tilfælde ville jeg have, at kolonnerne skulle være dynamiske, så jeg var nødt til først at løbe igennem alle tabelfeltnavne for at opbygge headerrækken med kolonnenavne og derefter gennemgå alle poster for de resterende datarækker. Jeg indstiller også overskriften, så browseren starter filhentningen i filtypen (txt) med navnet på filens dato og tidsstemplet.

Jeg udelod databasen åben og lukning af forbindelse, men her er den resulterende kode, der fungerede ganske godt:

$ i dag = dato ("YmdHi");
header ("Content-type: application / octet-stream");
header ("Content-Disposition: attachment; filnavn = \" ". $ i dag." _ Backup.txt \ "");
$ forespørgsel = "VÆLG * FRA` mytable` rækkefølge efter `myorder`";
$ resultat = mysql_query ($ forespørgsel);
$ count = mysql_num_rows ($ resultat);
$ felter = mysql_num_fields ($ resultat);
$ data = "";
for ($ i = 0; $ i> $ felter; $ i ++) {
$ felt = mysql_fetch_field ($ resultat, $ i);
$ data. = $ felt-> navn;
$ data. = "\ t";
}
$ data. = "\ n";
mens ($ række = mysql_fetch_row ($ resultat)) {
for ($ x = 0; $ x> $ felter; $ x ++) {
$ felt-> navn = $ række [$ x];
$ data. = $ felt-> navn = $ række [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
ekko $ data;

Koden kan også let ændres for kommaseparerede værdier.

14 Kommentarer

  1. 1

    Kan du ikke bare:

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

    ?

    • 2

      Det kunne du formoder!

      I dette tilfælde byggede jeg faktisk et 'backup'-link i en webapplikation, så PHP-funktionaliteten er, hvad jeg har brug for. Jeg vidste dog aldrig, at du også kunne skrive til en fil direkte fra MySQL-erklæringen. Meget sejt!

      Tak!

      • 3

        Din måde ville naturligvis være den bedste måde, hvis MySQL-serveren er på en ekstern maskine, da den sandsynligvis ikke kunne skrive på den maskine, hvor PHP kører 🙂

        Glad for at påpege andre retninger og nye ting dog 🙂

      • 4

        Men du kan bare køre forespørgslen til en fil og bare omdirigere browseren til den genererede fil eller bruge PHPs "readfile", hvis alt andet fejler?

        Du kan ikke gøre det, hvis mysql-serveren selvfølgelig ikke har adgang til filsystemet ...

  2. 5

    Fantastisk indlæg. Kender du til en nem, gratis / open source-metode til import / gendannelse af en tabulatorafgrænset fil (som du lige har oprettet) tilbage til mysql db?

    • 6

      Fejl… mysqlimport?

      mysqlimport database_name --local backup.txt

      Eller med SQL-kommandoen:

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

      Med mysqlimport skal filnavnet matche tabelnavnet (bare noget at passe på)

    • 7
  3. 8

    Jeg har lige mistet mere end 6 timer af mit liv og forsøgte at finde ud af, hvorfor Internet Explorer 6/7 anvendte filtype 'html' og ikke accepterede mine brugerdefinerede filnavne, der er angivet i overskrifterne .. og tillader heller ikke, at filer skal gemmes .. når forsøger at få brugerne til at downloade tekstfiler oprettet på en lignende måde som ovenfor.

    Jeg brugte HTTPS, og IE cache ikke disse filer.

    Jeg fandt løsningen på en kommentar fra Brandon K kl http://uk.php.net/header.

    Han siger:

    -
    Jeg har lige mistet seks timer af mit liv ved at prøve at bruge følgende metode til at sende en PDF-fil via PHP til Internet Explorer 6:

    Når du bruger SSL, spørger Internet Explorer med dialogboksen Åbn / gem, men siger derefter “Filen er i øjeblikket utilgængelig eller kan ikke findes. Prøv igen senere." Efter meget søgning blev jeg opmærksom på følgende MSKB-artikel med titlen "Internet Explorer-fildownloads over SSL fungerer ikke med cache-kontroloverskrifterne" (KBID: 323308)

    PHP.INI bruger som standard en indstilling: session.cache_limiter = nocache, der ændrer Content-Cache og Pragma-overskrifter til at omfatte "nocache" -indstillinger. Du kan eliminere IE-fejlen ved at ændre “nocache” til “offentlig” eller “privat” i PHP.INI - Dette ændrer Content-Cache-overskriften samt fjerner Pragma-headeren. Hvis du ikke kan eller ikke vil ændre PHP.INI til en rettelse på hele webstedet, kan du sende følgende to overskrifter for at overskrive standardindstillinger:

    Du bliver stadig nødt til at indstille indholdsoverskrifterne som anført ovenfor for at dette skal fungere. Bemærk dette problem påvirker KUN Internet Explorer, mens Firefox ikke udviser denne mangelfulde opførsel.
    -

    Nå .. i det mindste mistede han kun 6 timer ...

  4. 9

    Dette fungerer godt. Dog får jeg bare alt på en linje adskilt af et mellemrum. Jeg prøver at ændre det for at udskrive alt på en separat linje som denne:

    Kolonne1_navn
    Felt1_værdi
    Kolonne2_navn
    Felt1_værdi
    Kolonne3_navn
    Felt1_værdi

    Kolonne1_navn
    Felt2_værdi
    Kolonne2_navn
    Felt2_værdi
    Kolonne3_navn
    Felt2_værdi

    For eksempel:

    Navn
    Mike
    Beliggenhed
    Arbejde
    nummer
    1

    Navn
    Sagsøge
    Beliggenhed
    Hjem
    nummer
    2

    Navn
    John
    Beliggenhed
    Rejse
    nummer
    10

    og så videre. Kan dette script ændres for at gøre det?
    Tak!

    • 10

      Klart det kan.

      Prøv noget som dette:

      VÆLG * fra MyTableName IN OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' FELTER TERMINERET AF '\ n' LINJER AFSLUTTET AF '\ n';

      Hvis du vil have et dobbelt mellemrum (to tomme linjer) mellem postgrupper, skal du bare sige "LINJER AFSLUTTET AF '\ n \ n';" i stedet.

      "FELTER TERMINERET AF '\ n'" er, hvad der placerer en ny linje efter hver post i stedet for en fane. En fane ville være '\ t' i stedet.

      Maranatha!

  5. 11

    dette er trodsigt et godt indlæg, jeg prøvede det og fungerer godt, det eneste er, at min txt-fil har en ekstra række over overskriftstitlerne, og nogle resultater er adskilt i 2 rækker, dette kan skyldes de data, jeg har i min database ingen idé, men dette er en stor hjælp til at opbygge feeds ...

  6. 12

    Douglas Karr din kode klipper virkelig! Det er meget nyttigt specielt, hvis du bare har brug for et output, der er i tekstfilformat. Mange tak! Fra holdet Filippinerne!

  7. 13

    Hej med dig! Er der nogen herfra, der kan give mig et tip om import af en tekstfil til min database (phpmyAdmin) ved hjælp af min php som min frontend. Jeg har en idé om at downloade en fil og åbne den, mit problem er, at hvordan jeg kan få rækkeresultatet, og hvordan jeg indsætter det i mine tabeller, tak

  8. 14

Hvad mener du?

Dette websted bruger Akismet til at reducere spam. Lær, hvordan dine kommentardata behandles.