PHP i MySQL: exporteu una consulta a un fitxer delimitat per pestanyes

logotips mysql php

Aquest cap de setmana volia crear una pàgina que simplement fes una còpia de seguretat de qualsevol consulta o taula en un fitxer delimitat per pestanyes. La majoria dels exemples a la xarxa tenen les columnes codificades de manera dura.

En el meu cas, volia que les columnes fossin dinàmiques, de manera que primer havia de recórrer tots els noms dels camps de la taula per crear la fila de capçalera amb noms de columna i, a continuació, recórrer tots els registres de les files de dades restants. També he configurat la capçalera perquè el navegador iniciï la baixada del fitxer en el tipus de fitxer (txt) amb el nom de la data del fitxer i la marca de temps.

Vaig deixar de banda la connexió oberta i tancada de la base de dades, però aquí teniu el codi resultant que va funcionar força bé:

$ avui = data ("YmdHi");
capçalera ("Tipus de contingut: application / octet-stream");
header ("Content-Disposition: attachment; filename = \" ". $ today." _ Backup.txt \ "");
$ query = "SELECT * FROM` mytable` order by `myorder`";
$ result = mysql_query ($ consulta);
$ recompte = mysql_num_rows ($ resultat);
$ camps = mysql_num_fields ($ resultat);
$ data = "";
per a ($ i = 0; $ i> $ camps; $ i ++) {
$ camp = mysql_fetch_field ($ resultat, $ i);
$ dades. = $ camp-> nom;
$ data. = "\ t";
}
$ data. = "\ n";
while ($ fila = mysql_fetch_row ($ resultat)) {
per a ($ x = 0; $ x> $ camps; $ x ++) {
$ camp-> nom = $ fila [$ x];
$ dades. = $ camp-> nom = $ fila [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
eco $ data;

El codi també es pot modificar fàcilment per als valors separats per comes.

14 Comentaris

  1. 1
    • 2

      Suposo que podria!

      En aquest cas, en realitat estava construint un enllaç de "còpia de seguretat" en una aplicació web, de manera que la funcionalitat de PHP és el que necessitava. Tanmateix, mai vaig saber que també podies escriure en un fitxer directament des de la instrucció MySQL. Molt guai!

      Gràcies!

      • 3

        Per descomptat, la teva manera seria la millor si el servidor MySQL es troba en una màquina remota, ja que probablement no podria escriure a la màquina on s'executa PHP 🙂

        Encantat d'indicar altres direccions i coses noves, però 🙂

      • 4

        Però només podeu executar la consulta a un fitxer i redirigir el navegador al fitxer generat, o utilitzar el "fitxer de lectura" de PHP si tot falla?

        No ho podreu fer si el servidor mysql no té accés al sistema de fitxers, és clar...

  2. 5
    • 6

      Errr... mysqlimport?

      mysqlimport database_name --local backup.txt

      O amb l'ordre SQL:

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

      Amb mysqlimport, el nom del fitxer ha de coincidir amb el nom de la taula (només cal tenir en compte)

    • 7
  3. 8

    Acabo de perdre més de 6 hores de la meva vida intentant esbrinar per què Internet Explorer 6/7 aplicava el tipus de fitxer "html" i no acceptava els meus noms de fitxers personalitzats especificats a les capçaleres... i tampoc permetia que es desessin fitxers... quan intentant que els usuaris baixin fitxers de text creats de manera similar a l'anterior.

    Estava fent servir HTTPS i IE no guarda aquests fitxers a la memòria cau.

    Vaig trobar la solució en un comentari de Brandon K a http://uk.php.net/header.

    Ell diu:

    -
    Acabo de perdre sis hores de la meva vida intentant utilitzar el següent mètode per enviar un fitxer PDF mitjançant PHP a Internet Explorer 6:

    Quan utilitzeu SSL, Internet Explorer us demanarà el diàleg Obre/Desa, però després diu "El fitxer no està disponible actualment o no es pot trobar. Siusplau, intenta-ho més tard." Després de moltes cerques, em vaig adonar del següent article MSKB titulat "Les descàrregues de fitxers d'Internet Explorer mitjançant SSL no funcionen amb les capçaleres de control de memòria cau" (KBID: 323308)

    De manera predeterminada, PHP.INI utilitza una configuració: session.cache_limiter = nocache que modifica les capçaleres Content-Cache i Pragma per incloure opcions "nocache". Podeu eliminar l'error d'IE canviant "nocache" a "públic" o "privat" a PHP.INI: això canviarà la capçalera Content-Cache i eliminarà completament la capçalera de Pragma. Si no podeu o no voleu modificar PHP.INI per a una correcció a tot el lloc, podeu enviar les dues capçaleres següents per sobreescriure els valors predeterminats:

    Encara haureu d'establir les capçaleres de contingut tal com s'indica més amunt perquè això funcioni. Tingueu en compte que aquest problema NOMÉS afecta Internet Explorer, mentre que Firefox no mostra aquest comportament defectuós.
    -

    Bé... almenys només va perdre 6 hores...

  4. 9

    Això funciona bé. Tanmateix, només tinc tot en una línia separada per un espai. Estic intentant modificar-lo per imprimir-ho tot en una línia separada com aquesta:

    Columna1_nom
    Camp1_valor
    Columna2_nom
    Camp1_valor
    Columna3_nom
    Camp1_valor

    Columna1_nom
    Camp2_valor
    Columna2_nom
    Camp2_valor
    Columna3_nom
    Camp2_valor

    Per exemple:

    Nom
    Mike
    Ubicació
    treball
    Nombre
    1

    Nom
    demanar
    Ubicació
    Inici
    Nombre
    2

    Nom
    John
    Ubicació
    Viatjar
    Nombre
    10

    etcètera. Es pot modificar aquest script per fer-ho?
    Gràcies!

    • 10

      Segur que pot.

      Proveu alguna cosa així:

      SELECCIONA * de MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' CAMPS TERMINATS PER '\n' LÍNIES TERMINADAS PER '\n';

      Si voleu un espai doble (dues línies buides) entre grups de registres, només heu de dir "LÍNIES TERMINADAS PER '\n\n';" en canvi.

      La part "CAMPS TERMINATS PER '\n'" és la que posa una nova línia després de cada registre, en lloc d'una pestanya. Una pestanya seria '\t'.

      Maranatha!

  5. 11

    Aquesta és, sense dubte, una gran publicació, ho vaig provar i funciona molt bé, l'única cosa és que el meu fitxer txt té una fila addicional a sobre dels títols de la capçalera i alguns resultats s'han separat en 2 files, això pot ser degut a les dades que tinc a la meva base de dades ni idea, però això és una gran ajuda per crear fonts...

  6. 12

    Douglas Karr el teu codi és realment fantàstic! És molt útil especialment si només necessiteu una sortida en format de fitxer de text. Moltes gràcies! De l'equip de Filipines!

  7. 13

    Hola! Hi ha algú d'aquí que em pugui donar una pista sobre com importar un fitxer de text a la meva base de dades (phpmyAdmin) utilitzant el meu php com a interfície. Tinc una idea sobre descarregar un fitxer i obrir-lo, el meu problema és com puc obtenir el resultat de la fila i com inserir-lo a les meves taules, gràcies

  8. 14

Què et sembla?

Aquest lloc utilitza Akismet per reduir el correu no desitjat. Esbrineu com es processa el vostre comentari.