PHP och MySQL: Exportera en fråga till en flikavgränsad fil

mysql php-logotyper

I helgen ville jag bygga en sida som helt enkelt skulle säkerhetskopiera alla frågor eller tabeller i en Tab-avgränsad fil. De flesta exemplen på nätet har kolumnerna hårdkodade.

I mitt fall ville jag att kolumnerna skulle vara dynamiska så jag var tvungen att först gå igenom alla tabellfältnamnen för att bygga rubrikraden med kolumnnamn och sedan gå igenom alla poster för de återstående dataraderna. Jag ställer också in rubriken så att webbläsaren startar nedladdningen av filen i filtypen (txt) med namnet på fildatumet och tidsstämplat.

Jag utelämnade databasens öppna och stängande anslutning, men här är den resulterande koden som fungerade ganska bra:

$ idag = datum ("YmdHi");
header ("Content-type: application / octet-stream");
rubrik ("Content-Disposition: attachment; filnamn = \" ". $ idag." _ Backup.txt \ "");
$ query = "VÄLJ * FRÅN" mytable "beställning med" myorder "";
$ resultat = mysql_query ($ fråga);
$ count = mysql_num_rows ($ resultat);
$ fält = mysql_num_fields ($ resultat);
$ data = "";
för ($ i = 0; $ i> $ fält; $ i ++) {
$ field = mysql_fetch_field ($ resultat, $ i);
$ data. = $ fält-> namn;
$ data. = "\ t";
}
$ data. = "\ n";
medan ($ row = mysql_fetch_row ($ result)) {
för ($ x = 0; $ x> $ fält; $ x ++) {
$ fält-> namn = $ rad [$ x];
$ data. = $ fält-> namn = $ rad [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
echo $ data;

Koden kan också enkelt modifieras för kommaseparerade värden.

14 Kommentarer

  1. 1

    Kan du inte bara göra:

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

    ?

    • 2

      Jag antar att du kunde!

      I det här fallet byggde jag faktiskt en "backup" -länk i en webbapplikation, så PHP-funktionaliteten är vad jag behövde. Men jag visste aldrig att du också kunde skriva till en fil direkt från MySQL-uttalandet. Väldigt coolt!

      Tack!

      • 3

        Din väg skulle naturligtvis vara det bästa sättet om MySQL-servern finns på en fjärrmaskin, eftersom den förmodligen inte skulle kunna skriva till den maskin där PHP körs 🙂

        Glad att påpeka andra riktningar och nya saker men 🙂

      • 4

        Men du kan bara köra frågan till en fil, och bara omdirigera webbläsaren till den genererade filen, eller använda PHP: s "readfile" om allt annat misslyckas?

        Du kommer inte att kunna göra det om mysql-servern naturligtvis inte har tillgång till filsystemet ...

  2. 5

    Bra inlägg. Känner du till en enkel, fri / öppen källkodsmetod för att importera / återställa en tabbavgränsad fil (som du just skapade) tillbaka till mysql db?

    • 6

      Errr ... mysqlimport?

      mysqlimport database_name --local backup.txt

      Eller med SQL-kommandot:

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

      Med mysqlimport måste filnamnet matcha tabellnamnet (bara något att se upp för)

    • 7
  3. 8

    Jag tappade precis mer än 6 timmar av mitt liv när jag försökte ta reda på varför Internet Explorer 6/7 använde filtyp 'html' och inte accepterade mina anpassade filnamn som anges i rubrikerna .. och tillåter inte att filer sparas .. när försöker få användare att ladda ner textfiler som skapats på ett liknande sätt som ovan.

    Jag använde HTTPS och IE cachar inte dessa filer.

    Jag hittade lösningen på en kommentar från Brandon K på http://uk.php.net/header.

    Han säger:

    -
    Jag tappade precis sex timmar av mitt liv och försökte använda följande metod för att skicka en PDF-fil via PHP till Internet Explorer 6:

    När du använder SSL kommer Internet Explorer att fråga med dialogrutan Öppna / spara, men säger sedan ”Filen är för närvarande inte tillgänglig eller kan inte hittas. Vänligen försök igen senare." Efter mycket sökning blev jag medveten om följande MSKB-artikel med titeln "Internet Explorer-filnedladdningar över SSL fungerar inte med cache-kontrollhuvuden" (KBID: 323308)

    PHP.INI använder som standard en inställning: session.cache_limiter = nocache som ändrar Content-Cache och Pragma-rubriker så att de inkluderar "nocache" -alternativ. Du kan eliminera IE-felet genom att ändra "nocache" till "offentlig" eller "privat" i PHP.INI - Detta kommer att ändra Content-Cache-rubriken och ta bort Pragma-rubriken helt. Om du inte kan eller inte vill ändra PHP.INI för en fix för hela webbplatsen kan du skicka följande två rubriker för att skriva över standardvärden:

    Du måste fortfarande ställa in innehållsrubrikerna enligt listan ovan för att detta ska fungera. Observera att detta problem ENDAST påverkar Internet Explorer, medan Firefox inte uppvisar detta felaktiga beteende.
    -

    Tja .. åtminstone förlorade han bara 6 timmar ...

  4. 9

    Det här fungerar bra. Men jag får bara allt på en rad åtskilda av ett mellanslag. Jag försöker ändra den för att skriva ut allt på en separat rad så här:

    Kolumn1_namn
    Fält1_värde
    Kolumn2_namn
    Fält1_värde
    Kolumn3_namn
    Fält1_värde

    Kolumn1_namn
    Fält2_värde
    Kolumn2_namn
    Fält2_värde
    Kolumn3_namn
    Fält2_värde

    Till exempel:

    Namn
    Mikrofon
    Plats
    Arbete
    Antal
    1

    Namn
    Stämma
    Plats
    Hem
    Antal
    2

    Namn
    John
    Plats
    Resa
    Antal
    10

    och så vidare. Kan detta skript ändras för att göra det?
    Tack!

    • 10

      Visst kan.

      Testa något så här:

      VÄLJ * från MyTableName IN OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' FÄLT AVSLUTAD AV '\ n' LINJER AVSLUTAD AV '\ n';

      Om du vill ha ett dubbelt mellanslag (två tomma rader) mellan inspelningsgrupper, säg bara "LINJER AVSLUTADE AV '\ n \ n';" istället.

      Delen “FÄLLEN AVSLUTAD AV '\ n'" är det som sätter en ny rad efter varje post istället för en flik. En flik skulle vara '\ t' istället.

      Maranatha!

  5. 11

    detta är trotsigt ett bra inlägg, jag försökte det och fungerar bra, det enda är att min txt-fil har en extra rad ovanför rubrikerna, och vissa resultat är separerade i två rader, det kan bero på de data jag har i min databas ingen aning, men detta är till stor hjälp för att bygga flöden ...

  6. 12

    Douglas Karr din kod verkligen rockar! Det är mycket användbart speciellt om du bara behöver en utdata som är i textfilformat. Tack så mycket! Från teamet Filippinerna!

  7. 13

    Hallå där! Finns det någon härifrån som kan ge mig en aning om att importera en textfil till min databas (phpmyAdmin) med min php som min frontend. Jag har en idé om att ladda ner en fil och öppna den, mitt problem är att hur jag kan få radresultatet och hur man sätter in det i mina tabeller, tack

  8. 14

Vad tror du?

Den här sidan använder Akismet för att minska spam. Läs om hur din kommentardata behandlas.