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 podríeu!

      En aquest cas, realment estava construint un enllaç de "còpia de seguretat" en una aplicació web, de manera que la funcionalitat PHP era el que necessitava. Tanmateix, mai no sabia que també podríeu escriure a un fitxer directament des de la sentència MySQL. Molt guai!

      Gràcies!

      • 3

        La vostra manera, per descomptat, seria la millor manera si el servidor MySQL es troba en una màquina remota, ja que probablement no seria capaç d’escriure a la màquina on s’executa PHP 🙂

        Encara m'alegro assenyalar altres indicacions i coses noves 🙂

      • 4

        Però només podríeu executar la consulta a un fitxer i redirigir el navegador al fitxer generat o utilitzar el "fitxer de lectura" de PHP si falla la resta?

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

  2. 5

    Gran post. Coneixeu un mètode fàcil, gratuït / de codi obert per importar / restaurar un fitxer delimitat per tabulacions (com el que acabeu de crear) de nou a la base de dades de mysql?

    • 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 fitxer 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.

    Feia servir HTTPS i IE no emmagatzema en memòria cau aquests fitxers.

    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à amb el quadre de diàleg Obrir / Desa, però després dirà: "El fitxer actualment no està disponible o no es pot trobar. Siusplau, intenta-ho més tard." Després de fer moltes cerques, em vaig adonar del següent article de 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)

    PHP.INI utilitza per defecte una configuració: session.cache_limiter = nocache que modifica les capçaleres Content-Cache i Pragma per incloure opcions de "nocache". Podeu eliminar l'error IE canviant "nocache" a "públic" o "privat" a PHP.INI - Això canviarà la capçalera Content-Cache i eliminarà completament la capçalera 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:

    Tot i així, haureu d’establir les capçaleres de contingut tal i com s’enumeren anteriorment perquè això funcioni. Tingueu en compte que aquest problema només afecta Internet Explorer, mentre que Firefox no presenta aquest comportament defectuós.
    -

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

  4. 9

    Això funciona bé. Tanmateix, tot puc aconseguir-ho en una sola línia separada per un espai. Intento modificar-lo per imprimir-ho tot en una línia diferent com aquesta:

    Columna1_nom
    Camp_valor
    Columna2_nom
    Camp_valor
    Columna3_nom
    Camp_valor

    Columna1_nom
    Camp_valor
    Columna2_nom
    Camp_valor
    Columna3_nom
    Camp_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í:

      SELECT * from MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' CAMPS TERMINATS PER '\ n' LÍNIES TERMINADES PER '\ n';

      Si voleu un espai doble (dues línies buides) entre els grups de registre, només cal que digueu "LÍNIES TERMINADES PER '\ n \ n';" en canvi.

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

      Maranatha!

  5. 11

    aquest és desafiant un missatge fantàstic, ho he provat i funciona molt bé, l'únic és que el meu fitxer txt té una fila addicional a sobre dels títols de la capçalera i alguns resultats estan separats en 2 files, això pot ser degut a les dades que tinc a la meva base de dades ni idea, però és una gran ajuda per crear feeds ...

  6. 12

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

  7. 13

    Hola! Hi ha algú d’aquí que pugui donar-me una pista sobre la importació d’un fitxer de text a la meva base de dades (phpmyAdmin) fent servir el meu php com a interfície. Tinc una idea de descarregar i obrir un fitxer, el meu problema és que com puc obtenir el resultat de la fila i com inserir-lo a les 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.