PHP e MySQL: exporta unha consulta a un ficheiro delimitado por tabulacións

logotipos mysql php

Esta fin de semana quería crear unha páxina que simplemente copiara calquera consulta ou táboa nun ficheiro delimitado por tabulacións. A maioría dos exemplos na rede teñen as columnas codificadas.

No meu caso, quería que as columnas fosen dinámicas, polo que primeiro tiven que percorrer todos os nomes dos campos da táboa para construír a fila de cabeceira con nomes de columnas e, a continuación, recorrer todos os rexistros das filas de datos restantes. Tamén configurei a cabeceira para que o navegador inicie a descarga do ficheiro no tipo de ficheiro (txt) co nome da data do ficheiro e a marca de tempo.

Deixei fóra a base de datos aberta e pechada, pero aquí tes o código resultante que funcionou bastante ben:

$ hoxe = data ("YmdHi");
cabeceira ("Tipo de contido: aplicación / fluxo de octetos");
header ("Content-Disposition: attachment; filename = \" ". $ today." _ Backup.txt \ "");
$ query = "SELECT * FROM` mytable` orde por `myorder`";
$ result = mysql_query ($ consulta);
$ count = mysql_num_rows ($ resultado);
$ campos = mysql_num_fields ($ resultado);
$ data = "";
para ($ i = 0; $ i> $ campos; $ i ++) {
$ campo = mysql_fetch_field ($ resultado, $ i);
$ datos. = $ campo-> nome;
$ data. = "\ t";
}
$ data. = "\ n";
while ($ fila = mysql_fetch_row ($ resultado)) {
para ($ x = 0; $ x> $ campos; $ x ++) {
$ campo-> nome = $ fila [$ x];
$ datos. = $ campo-> nome = $ fila [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
echo $ data;

O código pódese modificar facilmente tamén para valores separados por comas.

14 Comentarios

  1. 1
    • 2

      Supoño que poderías!

      Neste caso, estaba a construír unha ligazón de "copia de seguranza" nunha aplicación web, polo que a funcionalidade de PHP é o que necesitaba. Non obstante, nunca souben que tamén puideses escribir nun ficheiro directamente desde a instrución MySQL. Moi chulo!

      Grazas!

      • 3

        O teu camiño sería, por suposto, o mellor se o servidor MySQL está nunha máquina remota, xa que probablemente non podería escribir na máquina onde se está a executar PHP 🙂

        Encantado de indicar outras direccións e cousas novas 🙂

      • 4

        Pero pode simplemente executar a consulta a un ficheiro, e simplemente redirixir o navegador ao ficheiro xerado, ou usar o "ficheiro de lectura" de PHP se todo falla?

        Non poderás facelo se o servidor mysql non ten acceso ao sistema de ficheiros, por suposto...

  2. 5

    Gran publicación. Coñeces un método sinxelo e gratuíto/de código aberto para importar/restaurar un ficheiro delimitado por tabulacións (como acabas de crear) de novo na base de datos mysql?

    • 6

      Errr... mysqlimport?

      mysqlimport database_name --local backup.txt

      Ou co comando SQL:

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

      Con mysqlimport, o nome do ficheiro ten que coincidir co nome da táboa (só algo que debes ter en conta)

    • 7
  3. 8

    Acabo de perder máis de 6 horas da miña vida intentando descubrir por que Internet Explorer 6/7 estaba aplicando o tipo de ficheiro "html" e non aceptaba os meus nomes de ficheiro personalizados especificados nas cabeceiras... e tampouco permitía que se gardasen ficheiros... cando tentando que os usuarios descarguen ficheiros de texto creados dun xeito similar ao anterior.

    Estaba usando HTTPS e IE non almacena estes ficheiros na caché.

    Atopei a solución nun comentario de Brandon K en http://uk.php.net/header.

    Di:

    -
    Acabo de perder seis horas da miña vida intentando usar o seguinte método para enviar un ficheiro PDF a través de PHP a Internet Explorer 6:

    Ao usar SSL, Internet Explorer solicitará o diálogo Abrir/Gardar, pero despois di "O ficheiro non está dispoñible ou non se pode atopar. Por favor inténtao de novo máis tarde." Despois de moito buscar, decateime do seguinte artigo MSKB titulado "As descargas de ficheiros de Internet Explorer a través de SSL non funcionan coas cabeceiras do control da caché" (KBID: 323308)

    PHP.INI usa por defecto unha configuración: session.cache_limiter = nocache que modifica os encabezados de Content-Cache e Pragma para incluír opcións "nocache". Podes eliminar o erro de IE cambiando "nocache" a "público" ou "privado" en PHP.INI: isto cambiará a cabeceira Content-Cache e eliminará completamente a cabeceira Pragma. Se non pode ou non quere modificar PHP.INI para unha corrección en todo o sitio, pode enviar as dúas cabeceiras seguintes para sobrescribir os valores predeterminados:

    Aínda terás que configurar as cabeceiras de contido como se indica arriba para que isto funcione. Teña en conta que este problema SÓ afecta a Internet Explorer, mentres que Firefox non mostra este comportamento defectuoso.
    -

    Ben, polo menos só perdeu 6 horas...

  4. 9

    Isto funciona ben. Non obstante, teño todo nunha liña separada por un espazo. Estou tentando modificalo para imprimir todo nunha liña separada como esta:

    Nome_columna1
    Campo1_valor
    Nome_columna2
    Campo1_valor
    Nome_columna3
    Campo1_valor

    Nome_columna1
    Campo2_valor
    Nome_columna2
    Campo2_valor
    Nome_columna3
    Campo2_valor

    Por exemplo:

    nome
    Micrófono
    localización
    Traballar
    Número
    1

    nome
    procesar
    localización
    casa
    Número
    2

    nome
    John
    localización
    viaxe
    Número
    10

    etcétera. Pódese modificar este script para facelo?
    Grazas!

    • 10

      Claro que pode.

      Proba algo así:

      SELECCIONE * de MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' CAMPOS TERMINADOS POR '\n' LIÑAS TERMINADAS POR '\n';

      Se queres un espazo dobre (dúas liñas baleiras) entre os grupos de rexistro, só tes que dicir "LIÑAS TERMINADAS POR '\n\n';" en cambio.

      A parte "CAMPOS TERMINADOS POR '\n'" é a que pon unha nova liña despois de cada rexistro, en lugar dunha pestana. Unha pestana sería "\t" no seu lugar.

      Maranatha!

  5. 11

    Esta é, sen dúbida, unha publicación xenial, tenteino e funcionou moi ben, o único é que o meu ficheiro txt ten unha fila extra por riba dos títulos da cabeceira e algúns resultados separáronse en 2 filas, isto pode deberse aos datos que teño. na miña base de datos nin idea, pero esta é unha gran axuda para crear fontes...

  6. 12

    Douglas Karr o teu código realmente rocas! É moi útil, especialmente se só precisa unha saída en formato de ficheiro de texto. Moitas grazas! Do equipo de Filipinas!

  7. 13

    boas! Hai alguén de aquí que me poida dar unha pista sobre como importar un ficheiro de texto á miña base de datos (phpmyAdmin) usando o meu php como a miña interface. Teño unha idea de descargar un ficheiro e abrilo, o meu problema é como podo obter o resultado da fila e como inserilo nas miñas táboas, grazas

  8. 14

¿Que pensas?

Este sitio usa Akismet para reducir o spam. Aprende a procesar os teus datos de comentarios.