PHP et MySQL: exporter une requête vers un fichier délimité par des tabulations

logos php mysql

Ce week-end, je voulais créer une page qui sauvegarderait simplement n'importe quelle requête ou table dans un fichier délimité par des tabulations. La plupart des exemples sur le net ont les colonnes codées en dur.

Dans mon cas, je voulais que les colonnes soient dynamiques, je devais donc d'abord parcourir tous les noms de champs de la table pour créer la ligne d'en-tête avec les noms de colonnes, puis parcourir tous les enregistrements pour les lignes de données restantes. J'ai également défini l'en-tête de sorte que le navigateur lance le téléchargement du fichier dans le type de fichier (txt) avec le nom de la date du fichier et horodaté.

J'ai laissé de côté la base de données ouverte et la connexion de fermeture, mais voici le code résultant qui a très bien fonctionné:

$ aujourd'hui = date ("YmdHi");
en-tête ("Content-type: application / octet-stream");
header ("Content-Disposition: attachment; filename = \" ". $ today." _ Backup.txt \ "");
$ query = "SELECT * FROM` mytable` order by `myorder`";
$ résultat = mysql_query ($ query);
$ count = mysql_num_rows ($ result);
$ fields = mysql_num_fields ($ result);
$ data = "";
pour ($ i = 0; $ i> $ champs; $ i ++) {
$ field = mysql_fetch_field ($ result, $ i);
$ data. = $ champ-> nom;
$ data. = "\ t";
}
$ data. = "\ n";
while ($ row = mysql_fetch_row ($ result)) {
pour ($ x = 0; $ x> $ champs; $ x ++) {
$ champ-> nom = $ ligne [$ x];
$ data. = $ champ-> nom = $ ligne [$ x];
$ data. = "\ t";
}
$ data. = "\ n";
}
echo $ data;

Le code peut également être facilement modifié pour les valeurs séparées par des virgules.

14 Commentaires

  1. 1

    Tu ne peux pas simplement faire:

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

    ?

    • 2

      Je suppose que vous pourriez!

      Dans ce cas, je construisais en fait un lien de «sauvegarde» dans une application Web, donc la fonctionnalité PHP est ce dont j'avais besoin. Cependant, je n'ai jamais su que vous pouviez également écrire dans un fichier directement à partir de l'instruction MySQL. Très cool!

      Merci!

      • 3

        Votre chemin serait bien sûr le meilleur moyen si le serveur MySQL est sur une machine distante, car il ne pourrait probablement pas écrire sur la machine sur laquelle PHP est exécuté 🙂

        Heureux de souligner d'autres directions et de nouvelles choses 🙂

      • 4

        Mais vous pouvez simplement exécuter la requête vers un fichier, et simplement rediriger le navigateur vers le fichier généré, ou utiliser le «readfile» de PHP si tout le reste échoue?

        Vous ne pourrez pas faire cela si le serveur mysql n'a pas accès au système de fichiers bien sûr…

  2. 5

    Très bonne publication. Connaissez-vous une méthode simple, gratuite / open source pour importer / restaurer un fichier délimité par des tabulations (comme vous venez de le créer) dans la base de données mysql?

    • 6

      Euh… mysqlimport?

      mysqlimport database_name --local backup.txt

      Ou avec la commande SQL:

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

      Avec mysqlimport, le nom du fichier doit correspondre au nom de la table (juste quelque chose à surveiller)

    • 7
  3. 8

    Je viens de perdre plus de 6 heures de ma vie à essayer de comprendre pourquoi Internet Explorer 6/7 appliquait le type de fichier 'html' et n'acceptait pas mes noms de fichiers personnalisés spécifiés dans les en-têtes .. et n'autorisait pas non plus l'enregistrement de fichiers .. quand tenter de demander aux utilisateurs de télécharger des fichiers texte créés de la même manière que ci-dessus.

    J'utilisais HTTPS et IE ne cache pas ces fichiers.

    J'ai trouvé la solution sur un commentaire de Brandon K à http://uk.php.net/header.

    Il dit:

    -
    Je viens de perdre six heures de ma vie en essayant d'utiliser la méthode suivante pour envoyer un fichier PDF via PHP vers Internet Explorer 6:

    Lors de l'utilisation de SSL, Internet Explorer affichera la boîte de dialogue Ouvrir / Enregistrer, mais dit ensuite «Le fichier est actuellement indisponible ou introuvable. Veuillez réessayer plus tard." Après de nombreuses recherches, j'ai pris connaissance de l'article MSKB suivant intitulé «Les téléchargements de fichiers Internet Explorer via SSL ne fonctionnent pas avec les en-têtes de contrôle du cache» (KBID: 323308)

    PHP.INI utilise par défaut un paramètre: session.cache_limiter = nocache qui modifie les en-têtes Content-Cache et Pragma pour inclure les options «nocache». Vous pouvez éliminer l'erreur IE en changeant «nocache» en «public» ou «private» dans PHP.INI - Cela changera l'en-tête Content-Cache et supprimera complètement l'en-tête Pragma. Si vous ne pouvez pas ou ne voulez pas modifier PHP.INI pour un correctif à l'échelle du site, vous pouvez envoyer les deux en-têtes suivants pour écraser les valeurs par défaut:

    Vous devrez toujours définir les en-têtes de contenu comme indiqué ci-dessus pour que cela fonctionne. Veuillez noter que ce problème affecte UNIQUEMENT Internet Explorer, alors que Firefox ne présente pas ce comportement défectueux.
    -

    Au moins, il n'a perdu que 6 heures…

  4. 9

    Cela fonctionne bien. Cependant, je reçois tout sur une seule ligne séparée par un espace. J'essaye de le modifier pour tout imprimer sur une ligne distincte comme ceci:

    Nom_colonne1
    Champ1_valeur
    Nom_colonne2
    Champ1_valeur
    Nom_colonne3
    Champ1_valeur

    Nom_colonne1
    Champ2_valeur
    Nom_colonne2
    Champ2_valeur
    Nom_colonne3
    Champ2_valeur

    Exemple :

    Nom
    Michel
    Adresse
    Projets
    Numéro
    1

    Nom
    poursuivre en justice
    Adresse
    Accueil
    Numéro
    2

    Nom
    John
    Adresse
    Voyage
    Numéro
    10

    etc. Ce script peut-il être modifié pour le faire?
    Merci!

    • 10

      Bien sûr peut.

      Essayez quelque chose comme ceci:

      SELECT * from MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' CHAMPS TERMINÉS PAR '\ n' LIGNES TERMINÉES PAR '\ n';

      Si vous voulez un double espace (deux lignes vides) entre les groupes d'enregistrements, dites simplement «LIGNES TERMINÉES PAR '\ n \ n';» au lieu.

      La partie «CHAMPS TERMINÉS PAR '\ n'» est ce qui place une nouvelle ligne après chaque enregistrement, au lieu d'un onglet. Un onglet serait à la place '\ t'.

      Maranatha!

  5. 11

    c'est un excellent article, je l'ai essayé et fonctionne très bien, la seule chose est que mon fichier txt a une ligne supplémentaire au-dessus des titres d'en-tête, et certains résultats sont séparés en 2 lignes, cela peut être dû aux données que j'ai dans ma base de données aucune idée, mais c'est une aide précieuse pour créer des flux…

  6. 12

    Douglas Karr votre code est vraiment génial! C'est très utile surtout si vous avez juste besoin d'une sortie au format texte. Merci beaucoup! De l'équipe des Philippines!

  7. 13

    héy! Y a-t-il quelqu'un d'ici qui puisse me donner un indice sur l'importation d'un fichier texte dans ma base de données (phpmyAdmin) en utilisant mon php comme frontal. J'ai une idée sur le téléchargement d'un fichier et son ouverture, mon problème est de savoir comment obtenir le résultat de la ligne et comment l'insérer dans mes tableaux, merci

  8. 14

Que pensez-vous?

Ce site utilise Akismet pour réduire les spams. Découvrez comment sont traitées les données de vos commentaires..