PHP y MySQL: exportar una consulta a un archivo delimitado por tabulaciones

logotipos de mysql php

Este fin de semana quería crear una página que simplemente respaldara cualquier consulta o tabla en un archivo delimitado por tabulaciones. La mayoría de los ejemplos en la red tienen las columnas codificadas.

En mi caso, quería que las columnas fueran dinámicas, así que primero tuve que recorrer todos los nombres de los campos de la tabla para construir la fila del encabezado con los nombres de las columnas, y luego recorrer todos los registros de las filas de datos restantes. También configuro el encabezado para que el navegador inicie la descarga del archivo en el tipo de archivo (txt) con el nombre de la fecha y la hora del archivo.

Dejé la conexión de apertura y cierre de la base de datos, pero aquí está el código resultante que funcionó bastante bien:

$ hoy = fecha ("YmdHi");
encabezado ("Tipo de contenido: aplicación / secuencia de octetos");
header ("Contenido-Disposición: archivo adjunto; nombre de archivo = \" ". $ hoy." _ Backup.txt \ "");
$ query = "SELECT * FROM` mytable` order by `myorder`";
$ resultado = mysql_query ($ consulta);
$ count = mysql_num_rows ($ resultado);
$ campos = mysql_num_fields ($ resultado);
$ datos = "";
para ($ i = 0; $ i> $ campos; $ i ++) {
$ campo = mysql_fetch_field ($ resultado, $ i);
$ datos. = $ campo-> nombre;
$ datos. = "\ t";
}
$ datos. = "\ n";
while ($ fila = mysql_fetch_row ($ resultado)) {
para ($ x = 0; $ x> $ campos; $ x ++) {
$ campo-> nombre = $ fila [$ x];
$ datos. = $ campo-> nombre = $ fila [$ x];
$ datos. = "\ t";
}
$ datos. = "\ n";
}
echo $ datos;

El código también se puede modificar fácilmente para valores separados por comas.

14 Comentarios

  1. 1

    ¿No puedes simplemente hacer:

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

    ?

    • 2

      ¡Supongo que podrías!

      En este caso, en realidad estaba construyendo un enlace de 'respaldo' en una aplicación web, por lo que la funcionalidad de PHP es lo que necesitaba. Sin embargo, nunca supe que también podría escribir en un archivo directamente desde la declaración MySQL. ¡Muy genial!

      ¡Gracias!

      • 3

        Su manera, por supuesto, sería la mejor si el servidor MySQL está en una máquina remota, ya que probablemente no podría escribir en la máquina donde PHP se está ejecutando

        Sin embargo, me alegro de señalar otras direcciones y cosas nuevas 🙂

      • 4

        Pero, ¿podría simplemente ejecutar la consulta en un archivo y simplemente redirigir el navegador al archivo generado, o usar el "archivo de lectura" de PHP si todo lo demás falla?

        No podrá hacer eso si el servidor mysql no tiene acceso al sistema de archivos, por supuesto ...

  2. 5

    Buena publicación. ¿Conoce un método fácil, gratuito / de código abierto para importar / restaurar un archivo delimitado por tabulaciones (como acaba de crear) de nuevo en la base de datos mysql?

    • 6

      Errr… ¿mysqlimport?

      mysqlimport database_name --local backup.txt

      O con el comando SQL:

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

      Con mysqlimport, el nombre del archivo debe coincidir con el nombre de la tabla (solo algo a tener en cuenta)

    • 7
  3. 8

    Acabo de perder más de 6 horas de mi vida tratando de averiguar por qué Internet Explorer 6/7 estaba aplicando el tipo de archivo 'html' y no aceptaba mis nombres de archivo personalizados especificados en los encabezados ... y tampoco permitía que los archivos se guardaran ... cuando intentar que los usuarios descarguen archivos de texto creados de manera similar a la anterior.

    Estaba usando HTTPS e IE no almacena en caché estos archivos.

    Encontré la solución en un comentario de Brandon K en http://uk.php.net/header.

    Él dice:

    -
    Acabo de perder seis horas de mi vida tratando de usar el siguiente método para enviar un archivo PDF a través de PHP a Internet Explorer 6:

    Al usar SSL, Internet Explorer mostrará el cuadro de diálogo Abrir / Guardar, pero luego dice “El archivo no está disponible actualmente o no se puede encontrar. Por favor, inténtelo de nuevo más tarde." Después de muchas búsquedas, me di cuenta del siguiente artículo de MSKB titulado "Las descargas de archivos de Internet Explorer a través de SSL no funcionan con los encabezados de control de caché" (KBID: 323308)

    PHP.INI por defecto usa una configuración: session.cache_limiter = nocache que modifica los encabezados Content-Cache y Pragma para incluir opciones "nocache". Puede eliminar el error de IE cambiando "nocache" a "público" o "privado" en PHP.INI. Esto cambiará el encabezado Content-Cache y eliminará por completo el encabezado Pragma. Si no puede o no desea modificar PHP.INI para una corrección en todo el sitio, puede enviar los siguientes dos encabezados para sobrescribir los valores predeterminados:

    Aún necesitará configurar los encabezados de contenido como se indica arriba para que esto funcione. Tenga en cuenta que este problema SÓLO afecta a Internet Explorer, mientras que Firefox no muestra este comportamiento defectuoso.
    -

    Bueno ... al menos solo perdió 6 horas ...

  4. 9

    Esto funciona bien. Sin embargo, solo obtengo todo en una línea separada por un espacio. Estoy tratando de modificarlo para imprimir todo en una línea separada como esta:

    Column1_name
    Field1_value
    Column2_name
    Field1_value
    Column3_name
    Field1_value

    Column1_name
    Field2_value
    Column2_name
    Field2_value
    Column3_name
    Field2_value

    Por ejemplo:

    Nombre
    Mike
    Ubicación
    Trabajo
    Número
    1

    Nombre
    demandar
    Ubicación
    Inicio
    Número
    2

    Nombre
    John
    Ubicación
    Viajar
    Número
    10

    y así. ¿Se puede modificar este script para hacerlo?
    ¡Gracias!

    • 10

      Claro que puede.

      Intente algo como esto:

      SELECCIONE * de MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' CAMPOS TERMINADOS POR '\ n' LÍNEAS TERMINADAS POR '\ n';

      Si desea un espacio doble (dos líneas vacías) entre los grupos de registros, simplemente diga "LÍNEAS TERMINADAS POR '\ n \ n';" en lugar.

      La parte “CAMPOS TERMINADOS POR '\ n'” es lo que pone una nueva línea después de cada registro, en lugar de una pestaña. En su lugar, una pestaña sería '\ t'.

      Maranatha!

  5. 11

    esta es definitivamente una gran publicación, la probé y funcionó muy bien, lo único es que mi archivo txt tiene una fila adicional sobre los títulos del encabezado, y algunos resultados se han separado en 2 filas, esto puede deberse a los datos que tengo en mi base de datos, ni idea, pero esto es de gran ayuda para crear feeds ...

  6. 12

    Douglas Karr tu código realmente mola! Es muy útil especialmente si solo necesita una salida que esté en formato de archivo de texto. ¡Muchas gracias! ¡Del equipo de Filipinas!

  7. 13

    ¡Hola! ¿Hay alguien de aquí que pueda darme una pista sobre cómo importar un archivo de texto a mi base de datos (phpmyAdmin) usando mi php como mi interfaz? Tengo una idea sobre cómo descargar un archivo y abrirlo, mi problema es cómo puedo obtener el resultado de la fila y cómo insertarlo en mis tablas, gracias

  8. 14

¿Qué piensas?

Este sitio usa Akismet para reducir el correo no deseado. Descubra cómo se procesan los datos de sus comentarios.