IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Télécharger le contenu d'une variable dans un fichier .csv directement via le Navigateur Web


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut Télécharger le contenu d'une variable dans un fichier .csv directement via le Navigateur Web
    Bonsoir à tous.

    Je voudrais savoir comment télécharger tout le contenu d'une variable dans un fichier .csv ???

    En clair, je veux que dès que je lance la page "localhost/test.php", qui contient d'ailleurs le code de ma variable, que cela télécharge automatiquement un fichier au format. csv via le navigateur web (header ou user-agent) le contenu de la variable.

    Aidez-moi svp.

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Hello

    Aucun intéret dans un contexte web, sauf voler des données de ton utilisateur à son insu.
    Apres si tu veux récupérer le résultat d'un traitement sur un serveur, un peu de php en mode client et un ordonnanceur (cron, tache planifié, .... ) et c'est parti.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par gene69 Voir le message
    Hello

    Aucun intéret dans un contexte web, sauf voler des données de ton utilisateur à son insu.
    Apres si tu veux récupérer le résultat d'un traitement sur un serveur, un peu de php en mode client et un ordonnanceur (cron, tache planifié, .... ) et c'est parti.
    Voler les données de son utilisateur ???
    Ça n'a rien à voir. J'ai plutôt écrit du code qui génère automatiquement des nombres que je veux exporter dans un fichier .csv. C.'est tout.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Ah, en fait, tu veux faire un script qui fait un export de données dans un fichier (c'était pas super clair dans la 1ère description)
    C'est assez simple : tu écris ton script exactement comme si tu générais un fichier à enregistrer (fopen, fputcsv, https://php.net/manual/fr/function.fclose.php) mais en l'envoyant directement sur php://output et en utilisant les entêtes adéquats.

    Exemple (trouvé sur le net, non testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    $now = gmdate("D, d M Y H:i:s");
        header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
        header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
        header("Last-Modified: {$now} GMT");
     
        // force download  
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
     
        // disposition / encoding on response body
        header("Content-Disposition: attachment;filename={$filename}");
        header("Content-Transfer-Encoding: binary");
     
    // si les données sont dans un tableau nommé $array, indexé par les noms des colonnes
     
    if (count($array) == 0) {
         return null;
       }
       ob_start();
       $df = fopen("php://output", 'w');
       fputcsv($df, array_keys(reset($array)));
       foreach ($array as $row) {
          fputcsv($df, $row);
       }
       fclose($df);
    echo ob_get_clean();
    exit(0);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Celira Voir le message
    Ah, en fait, tu veux faire un script qui fait un export de données dans un fichier (c'était pas super clair dans la 1ère description)
    C'est assez simple : tu écris ton script exactement comme si tu générais un fichier à enregistrer (fopen, fputcsv, https://php.net/manual/fr/function.fclose.php) mais en l'envoyant directement sur php://output et en utilisant les entêtes adéquats.
    [/code]
    Merci Celira mais là encore c'est un peu flou de mon côté. Je connais fputcsv car j'ai l'ai utilisé. Mon constat avec fputcsv est qu'il exige un Tableau et affiche les données avec des virgules ALORS que moi, je souhaite afficher mes données (numéros générés) ligne par ligne ET NON séparées par des virgules sur une même ligne.

    Mais vu que fputcsv fonctionne avec les valeurs d'un Tableau séparées par des virgules, j'ai décidé de me tourner vers vous pour savoir s'il y a un moyen d'afficher mes données générées par mon code (ci-dessous) dans un fichier .csv ligne par ligne.

    VOICI MON CODE EN QUESTION:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?php
     
    // numéro de base
    $numero         = (isset($_POST['numField'])) ? $_POST['numField'] : 0;
    $countIndic         = (isset($_POST['numIndic'])) ? $_POST['numIndic'] : 0;
    // longueur souhaité (doit être plus grande que longueur de $numéro)
    $longueur_total = (isset($_POST['numLength'])) ? $_POST['numLength'] : 0;
    // longueur utilisé en retirant la longueur de base
    $longueur       = $longueur_total - strlen($numero);
    // calcule de la puissance de 10 en fonction de la longueur souhaité
    $max            = pow(10, $longueur);
    // affichage du maximun de tour de la boucle
    // echo "<h1>$max</h1>";
    for ($i = 0; $i < $max; $i++) {
        // différence de longueur
        $diff = $longueur - strlen($i);
        $zero = "";
        for ($a = 0; $a < $diff; $a++) {
            // ajout des zéro devant
            $zero .= "0";
        }
        // concaténation du résultat
        $resultat = $numero . $zero . $i;
        // effacement des zéro
        $zero     = "";
        // affichage du résultat
    	echo $resultat . '<br>';
     
    }
     
    ?>

    NB: Pour être clair et court, je veux simplement stocker mes numéros générés par mon Code PHP dans un fichier .csv en le TÉLÉCHARGEANT DIRECTEMENT via le HEADER de mon Navigateur Web et ce, LIGNE PAR LIGNE.

    COMMENT DONC UTILISER fputcsv POUR ENREGISRER ET TELECHARGER AUTOMATIQUEMENT VIA LE HEADER (User-agent) DU NAVIGATEUR LES NUMEROS GENERES PAR MON CODE CI-DESSUS DANS UN FICHIER AU FORMAT .csv LIGNE PAR LIGNE ???

    Dans mon cas, ce sont les valeurs (numéros générés) par la variable $resultat que je cherche à enregistrer dans un fichier .csv LIGNE par LIGNE.

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Si tu veux une valeur par ligne, il te suffit de faire un tableau d'une seule case (ou d'utiliser fputs avec un saut de ligne à la fin)

    Pour la partie "faire télécharger par le navigateur", c'est à ça que sert le gros bloc de "headers" au début de mon exemple Comment forcer le téléchargement d'un fichier ?

    En croisant ton code et l'exemple que j'ai trouvé, on obtient un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    $now = gmdate("D, d M Y H:i:s");
    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
    header("Last-Modified: {$now} GMT");
     
    // force download  
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
     
    // disposition / encoding on response body
    header("Content-Disposition: attachment;filename={$filename}");
    header("Content-Transfer-Encoding: binary");
     
    ob_start();
    $df = fopen("php://output", 'w');
     
    // pour mettre un entête sur le CSV
    $entetes = ['Numero'];
    fputcsv($df, $entetes);
     
    // numéro de base
    $numero         = (isset($_POST['numField'])) ? $_POST['numField'] : 0;
    $countIndic         = (isset($_POST['numIndic'])) ? $_POST['numIndic'] : 0;
    // longueur souhaité (doit être plus grande que longueur de $numéro)
    $longueur_total = (isset($_POST['numLength'])) ? $_POST['numLength'] : 0;
    // longueur utilisé en retirant la longueur de base
    $longueur       = $longueur_total - strlen($numero);
    // calcule de la puissance de 10 en fonction de la longueur souhaité
    $max            = pow(10, $longueur);
    // affichage du maximun de tour de la boucle
    // echo "<h1>$max</h1>";
    for ($i = 0; $i < $max; $i++) {
        // différence de longueur
        $diff = $longueur - strlen($i);
        $zero = "";
        for ($a = 0; $a < $diff; $a++) {
            // ajout des zéro devant
            $zero .= "0";
        }
        // concaténation du résultat
        $resultat = $numero . $zero . $i;
        // effacement des zéro
        $zero     = "";
        // affichage du résultat
        $row = [$resultat];
        fputcsv($df, $row);
    }
    fclose($df);
    echo ob_get_clean();
    exit(0);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    C'est exactement ce que je recherchais. Merci Celira

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier le contenu d'une variable dans un fichier de conf XML
    Par ShellNoob dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 28/11/2017, 22h47
  2. [CSV] Télécharger le contenu d'une variable
    Par Benoit.RTPW dans le forum Langage
    Réponses: 5
    Dernier message: 05/03/2009, 12h21
  3. Réponses: 3
    Dernier message: 06/02/2006, 17h04
  4. PB récupérez le contenu d'une variable dans une balise titr
    Par crevettepourrie dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/01/2006, 17h41
  5. Réponses: 3
    Dernier message: 27/07/2005, 15h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo