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 :

[CSV] fputcsv me génère un fichier vide


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 21
    Points
    21
    Par défaut [CSV] fputcsv me génère un fichier vide
    Bonjour @ toutezéatous,

    Je me suis inspirée de ce code pour générer un fichier excell (.csv) avec les données d'une table sql. Tout a l'air de bien fonctionner (je n'ai aucun message d'erreur) mais le fichier généré est vide ;-( Je n'ai même pas le nom des champs...
    J'y ai passé mon après-midi mais là je craque un peu (en fait à mort !!) alors je viens vous demander un petit peu d'aide...

    La version de PHP est la 5.2.5

    Voici mon code :
    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
     
    $sql = 'SELECT * FROM tracking' ;
    mysql_select_db($sql_bdd, $bdd_link) or die(mysql_error());
    $result = mysql_query($sql, $bdd_link) or die(mysql_error());
    if (!$result) die('Pb dans la generation du fichier');
    $num_fields = mysql_num_fields($result);
    $headers = array();
    for ($i = 0; $i < $num_fields; $i++) {
    	$headers[] = mysql_field_name($result , $i);
    }
    $fp = fopen($fname, 'w');	
    if ($fp == false) {die("Impossible d'ecrire dans le fichier");}
    if ($fp && $result) {
    	header("Content-Disposition: attachment; filename=\"tracking.csv\"");
    	header("Content-Type: text/csv");
    	header("Pragma: no-cache");
    	header("Expires: 0");
     
    	fputcsv($fp, $headers);
    	while($row = mysql_fetch_row($result)){
    		fputcsv($fp, $row);			
    	}
    	fclose($fp);
    	mysql_close(); 
    	exit() ;
    }
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fputcsv($fp, $row,"\t" );
    fputcsv($fp, array_values($row));
    fputcsv($fp, $row,";" );
    Avec le même résultat... Je n'ai même pas mes en-têtes de colonne...

    J'ai aussi essayé pour le fun de mettre un fwrite("toto" ) juste après le fopen() mais toujours rien, c'est vide !

    J'ai vérifié ma table qui est bien alimentée et si je fait un print_r($row), j'obtiens bien mes valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Array ( [0] => 25 [1] => 33 [2] => 886a0d1d527ebf8259e69c9a59a3b9d5 [3] => demo@laposte.net [4] => 2009-04-02 14:16:17 [5] => /selection-immobiliere-biens-preferes.php [6] => )
    Array ( [0] => 29 [1] => 33 [2] => 886a0d1d527ebf8259e69c9a59a3b9d5 [3] => demo@laposte.net [4] => 2009-04-02 14:23:21 [5] => /ventes-flash-prix-promotionnels.php [6] => filtre_region=-1 ; tri_ordre=cp_asc ; )

    Si vous avez une idée ce serait super cooooooooooool !

    Merci @ toutezéatous et excellente soirée !

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 267
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 267
    Points : 8 565
    Points
    8 565
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par karpediem Voir le message
    J'ai aussi essayé pour le fun de mettre un fwrite("toto" ) juste après le fopen() mais toujours rien, c'est vide !
    Dans ce cas c'est peut-être l'ouverture du fichier qui pose pb. Que veut $fname ?
    Sinon met des "echo 'Je suis dans le $x_ième if( )'" un peu partout pour voir où ça passe et où ça casse.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Bonjour Seb et merci pour ta réponse, je me sens tout de suite moins seule au monde ;o)

    J'ai un peu avancé et je me suis rendu compte que si je vire la partie des "header" ça fonctionne... Mon fichier est bien généré sur mon serveur, avec le bon contenu.

    En revanche, dès que j'utilise les "header", soit j'ai un fichier vide, soit j'ai le contenu de ma page html... Inutil de précisé que ça ne m'intéresse pas du tout ;o)

    Ce que je trouve intéressant dans cette fonction header c'est de pouvoir sauvegarder mon fichier en local...

    J'ai vérifié que je n'envoyais rien avant les instructions "header" qui puisse le déranger, mais je ne vois pas où ça merdouille... Peut-être que je devrais appeler mon traitement dans un fichier à part ?

    Voici le code complet de ma page, des fois que tu y vois quelque chose...
    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
     
    <?php
    //------------ connexion  --------------------
    require_once('config/connexion.php'); 
    session_start(); // début de session
    $_POST['mess'] = '';
    //----------------- export -------------------------------
    if (isset($_POST['GO']))
    {
    	$fname = "tracking2.csv" ;
     
    	$sql = 'SELECT * FROM tracking' ;
    	mysql_select_db($sql_bdd, $bdd_link) or die(mysql_error());
    	$result = mysql_query($sql, $bdd_link) or die(mysql_error());
    	if (!$result) die('Pb dans la generation du fichier');
    	$num_fields = mysql_num_fields($result);
    	$headers = array();
    	for ($i = 0; $i < $num_fields; $i++) {
    		$headers[] = mysql_field_name($result , $i);
    	}
    	$fp = fopen($fname, 'w');
    	header("Content-Disposition: attachment; filename=$fname");
    	header("Content-Type: text/csv");
    	header("Pragma: no-cache");
    	header("Expires: 0");
    	fputcsv($fp, $headers);
    	while($row = mysql_fetch_row($result)){
    		fputcsv($fp, $row) or die ("Erreur" );
    		}
     
        fclose($fp);
    	mysql_close(); 
    }
     
    //--------------------------------------------------------
     
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
     
    ... Ma page html classique avec un bouton dans un formulaire pour lancer l'export...
     
    <form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="post" id="export" name="export" >
    Pour ma part, je ne vois pas ce qui pourrait déranger les "header"... et toi ?

    Déjà un grand MERCI pour ta réponse !

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 267
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 267
    Points : 8 565
    Points
    8 565
    Billets dans le blog
    17
    Par défaut
    Faudrait arrêter le script avec un exit( ) après l'envoi des données.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Merci !

    Je ne dois pas mettre le exit() au bon endroit car j'ai au final un fichier vide...

    Je l'ai mis juste après :

    fclose($fp);
    mysql_close();
    exit();

    C'est pas là ? Je ne vois pas où le mettre sinon...

    Merci et @ + !

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 267
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 267
    Points : 8 565
    Points
    8 565
    Billets dans le blog
    17
    Par défaut
    Oui, le exit( ) est bien placé à cet endroit.
    Manque qquechose d'autre : envoyer les données au client.
    Fais un readfile($fname) avant le exit( ).

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    T'es TROP FORT !!!!!

    Chuis trop contente

    Dommage que je ne puisse pas te faire une grosse bizz ;o))

    Encore un grand MERCI !

    Bonne continuation et @ bientôt !

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

Discussions similaires

  1. [PHP 5.2] [CSV] fputcsv : fichier vide
    Par *.Har(d)t dans le forum Langage
    Réponses: 2
    Dernier message: 12/05/2009, 14h30
  2. [Système] mysqldump génère un fichier vide
    Par Tchupacabra dans le forum Langage
    Réponses: 4
    Dernier message: 15/09/2008, 18h07
  3. [CSV] Enregistrer sous? Apres un fichier enregistré
    Par Anakior dans le forum Langage
    Réponses: 12
    Dernier message: 19/12/2005, 14h30
  4. Mysqldump donnant un fichier vide
    Par simoryl dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 15/02/2005, 17h42

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