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í está 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ía!

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

      Grazas!

      • 3

        O seu camiño sería, por suposto, o mellor xeito se o servidor MySQL estea nunha máquina remota, xa que probablemente non sería capaz de escribir na máquina onde se está executando PHP 🙂

        Encantado de sinalar outras direccións e cousas novas aínda que 🙂

      • 4

        Pero só podería executar a consulta a un ficheiro e redirixir o navegador ao ficheiro xerado ou usar o "arquivo de lectura" de PHP se falla todo o demais?

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

  2. 5
    • 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ó hai que ter coidado)

    • 7
  3. 8

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

    Estaba a usar HTTPS e IE non cachea estes ficheiros.

    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 vía PHP a Internet Explorer 6:

    Cando se usa SSL, Internet Explorer solicitaralle o diálogo Abrir / Gardar, pero despois di "O ficheiro non está dispoñible actualmente ou non se pode atopar. Por favor inténtao de novo máis tarde." Despois de moitas buscas, decateime do seguinte artigo de MSKB titulado "As descargas de ficheiros de Internet Explorer en SSL non funcionan coas cabeceiras de control de caché" (KBID: 323308)

    PHP.INI utiliza por defecto unha configuración: session.cache_limiter = nocache que modifica as cabeceiras Content-Cache e Pragma para incluír opcións de "nocache". Pode eliminar o erro 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 de todo o sitio, pode enviar as dúas cabeceiras seguintes para sobrescribir os valores predeterminados:

    Aínda necesitará configurar as cabeceiras do contido como se indican anteriormente para que isto funcione. Ten en conta que este problema SÓ afecta a Internet Explorer, mentres que Firefox non presenta este comportamento defectuoso.
    -

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

  4. 9

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

    Columna_nome
    Campo_valor
    Columna_nome
    Campo_valor
    Columna_nome
    Campo_valor

    Columna_nome
    Campo_valor
    Columna_nome
    Campo_valor
    Columna_nome
    Campo_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. ¿Pode modificarse este script para facelo?
    Grazas!

    • 10

      Claro que pode.

      Proba algo así:

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

      Se queres un dobre espazo (dúas liñas baleiras) entre os grupos de gravación, só tes que dicir “LIÑAS TERMINADAS POR '\ n \ n';” no seu lugar.

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

      Maranatha!

  5. 11

    Esta é unha publicación desafiante, intenteina e funciono xenial, o único é que o meu ficheiro txt ten unha fila adicional encima dos títulos da cabeceira e algúns resultados están separados en 2 filas. na miña base de datos nin idea, pero isto é unha gran axuda para crear feeds ...

  6. 12

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

  7. 13

    boas! Hai alguén de aquí que poida darme unha pista sobre como importar un ficheiro de texto á miña base de datos (phpmyAdmin) usando o meu php como interface. Teño unha idea de descargar un ficheiro e abrilo, o meu problema é que 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.