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

PHP & Base de données Discussion :

Ecriture CSV et téléchargement [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Mobilité
    Inscrit en
    Janvier 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Mobilité
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2014
    Messages : 31
    Points : 35
    Points
    35
    Par défaut Ecriture CSV et téléchargement
    Bonjour la communauté,

    Je viens demander votre secours pour une histoire de CSV... J'ai donc un script PHP qui génére un fichier csv (tabulation). Le fichier est nickel lorsque celui est créé dans le dossier de destination du site "/csv" mais lorsque je le propose au téléchargement pour l'utilisateur, çà déraille :s

    Une ligne en plus semble rajoutée, et la police ou l'encryptage semble se modifier ce qui rend le fichier unitilisable par la platforme qui doit traiter ce fichier. Quelqu'un aurait une idée ?

    Merci d'avance



    Screen CSV généré dans le dossier du site (la pas de souci ):

    Nom : pb_stock.PNG
Affichages : 591
Taille : 11,8 Ko



    Screen du fichier proposé en téléchargement ( 1 ligne en plus et même si on ne voit pas clairement sur cette capture d'écran, la police de "sku price" est modifiée )


    Nom : pb_stock 2.PNG
Affichages : 557
Taille : 14,3 Ko


    Script PHP qui génére le csv :

    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
    $headers[] = array('sku','price','minimum-seller-allowed-price','maximum-seller-allowed-price', 'quantity', 'leadtime-to-ship', 'fulfillment-channel');
    $aff = $link->query("SELECT rapport_ama.sku, rapport_cash.stock, rapport_ama.prix FROM rapport_ama, rapport_cash where rapport_cash.sku = rapport_ama.sku");
    while ($row = mysqli_fetch_array($aff))
    {
    	$sku = $row[0];
    	$stock = $row[1];
    	$prix = str_replace('.',',',$row[2]);
    	$lignes[] = array($sku, $prix, '', '', $stock, '', '');
     
    }
     
    // Paramétrage de l'écriture du futur fichier CSV
    $chemin = 'csv/rapport.txt';
    $delimiteur = "\t"; // Pour une tabulation, utiliser $delimiteur = "t";
     
    // Création du fichier csv (le fichier est vide pour le moment)
    // w+ : consulter http://php.net/manual/fr/function.fopen.php
    $fichier_csv = fopen($chemin, 'w+');
     
    // Si votre fichier a vocation a être importé dans Excel,
    // vous devez impérativement utiliser la ligne ci-dessous pour corriger
    // les problèmes d'affichage des caractères internationaux (les accents par exemple)
    fprintf($fichier_csv, chr(0xEF).chr(0xBB).chr(0xBF));
    foreach ($headers as $head) {
    	fputcsv($fichier_csv, $head, $delimiteur);
    }
    // Boucle foreach sur chaque ligne du tableau
    foreach($lignes as $ligne){
    	// chaque ligne en cours de lecture est insérée dans le fichier
    	// les valeurs présentes dans chaque ligne seront séparées par $delimiteur
    	fputcsv($fichier_csv, $ligne, $delimiteur);
    }
     
    // fermeture du fichier csv
    fclose($fichier_csv);

    Script PHP qui propose le téléchargement à l'utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $full_path = 'csv/rapport.txt';
    $file_name = 'rapport.txt';
    ini_set('zlib.output_compression', 0);
    header('Pragma: public');
    header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
    header('Content-Tranfer-Encoding: none');
    header('Content-Length: '.filesize($full_path));
    header('Content-MD5: '.base64_encode(md5_file($full_path)));
    header('Content-Type: application/forced-download; name="'.$file_name.'"');
    header('Content-Disposition: attachment; filename="'.$file_name.'"');
     
    readfile($full_path);
    exit;

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Quel est l'encodage de tes fichiers .php ?

    Essai en retirant cette ligne qui visiblement essai d'ajouter un BOM manuellement et qui n'est à mon avis pas une bonne idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf($fichier_csv, chr(0xEF).chr(0xBB).chr(0xBF));
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Mobilité
    Inscrit en
    Janvier 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Mobilité
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2014
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    Le fichier est juste un script php qui retourne directement à la page d'acceuil grâce à la fonction "header". Je n'ai donc pas préciser de type d'encodage comme le utf-8. Lorsque je rajoute des balises <html> afin de d'ajouter cette ligne dans la balise <head>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    le fichier télécharger inscrit ces balises dans le fichier :s

    Nom : pb_stock 3.PNG
Affichages : 477
Taille : 7,8 Ko

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je parle de l'encodage des fichiers .php (tu peux le contrôler avec ton éditeur préféré), pas d'un en-tête HTML (et evidemment mettre des balises HTML dans un CSV ça ne fonctionne pas).

    Tu as tenté ce que je t'ai proposé ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Mobilité
    Inscrit en
    Janvier 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Mobilité
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2014
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    Encoder manuellement avec mon éditeur Texte semble régler le problème de police étrange mais j'ai toujours ce problème de ligne supplémentaire.

    Supprimer la ligne fprintf($fichier_csv, chr(0xEF).chr(0xBB).chr(0xBF)); ne semble pas affecter quoi que ce soit.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Mobilité
    Inscrit en
    Janvier 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Mobilité
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2014
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    J'ai trouvé ma réponse (et je suis passé pour une brelle en prime) !
    Ma collègue est passée à coté de mon poste feignant un intérêt pour ce que je fais (plus pour la conversation que le code en lui-même je suppose ), je lui explique le problème dans les grandes lignes et voila qu'elle me répond :
    "C'est normal, tu a une ligne vide ici !"
    Le script qui écrit le csv prend en compte les saut de ligne vide du code !

    Bref merci de pour l'encodage Sabotage !
    Pour éviter de le faire manuellement je rajoute cette fonction en header :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header( 'content-type: text/html; charset=utf-8' );

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Sauf que là ton content-type est incorrect, ton fichier est un csv, pas du html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header( 'content-type: text/csv; charset=utf-8' );
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

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

Discussions similaires

  1. [PHP 5.4] Export CSV, le téléchargement ne se lance pas
    Par dojbouli dans le forum Langage
    Réponses: 4
    Dernier message: 04/11/2014, 15h43
  2. création d'un fichier CSV et téléchargement
    Par ryu20 dans le forum Langage
    Réponses: 2
    Dernier message: 16/09/2011, 08h51
  3. Ecriture .csv python 3.1
    Par mister2502 dans le forum Général Python
    Réponses: 4
    Dernier message: 02/07/2009, 18h06
  4. Réponses: 2
    Dernier message: 30/05/2006, 15h07
  5. [CSV] Téléchargement de fichier
    Par flydragon dans le forum Langage
    Réponses: 13
    Dernier message: 18/05/2006, 09h28

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