Fputcsv me génère un fichier vide ;-(( [Résolu]

karpediem 49 Messages postés mardi 30 mars 2004Date d'inscription 22 septembre 2014 Dernière intervention - 6 avril 2009 à 23:00 - Dernière réponse : fano97one 3 Messages postés jeudi 25 février 2010Date d'inscription 8 mars 2011 Dernière intervention
- 8 mars 2011 à 16:54
Bonjour @ toutezéatous,

Je souhaiterai 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 :

    $fname = "tracking.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');
    if ($fp == false) {die("Impossible d'ecrire dans le fichier");}
    if ($fp && $result) {
        //header('Content-Type: text/csv'); ///// J'ai essayé les 2
        header('Content-type: application/vnd.ms-excel');
        header('Content-Disposition: attachment; filename="tracking.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é :
fputcsv($fp, $row,"\t");
fputcsv($fp, array_values($row));
fputcsv($fp, $row,";");

Avec le même résultat...

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

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] => 26 [1] => 33 [2] => 886a0d1d527ebf8259e69c9a59a3b9d5 [3] => demo@laposte.net [4] => 2009-04-02 14:16:20 [5] => /ventes-flash-prix-promotionnels.php [6] => )
Array ( [0] => 27 [1] => 33 [2] => 886a0d1d527ebf8259e69c9a59a3b9d5 [3] => demo@laposte.net [4] => 2009-04-02 14:18:33 [5] => /fonction/contacter.php [6] => nom=dsfqfdf ; prenom=serge-henri ; objet=emploi+et+stages ; message=+tu+le+re%C3%A7ois+%3F ;)
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 ; )
Array ( [0] => 31 [1] => 33 [2] => 886a0d1d527ebf8259e69c9a59a3b9d5 [3] => demo@laposte.net [4] => 2009-04-02 14:25:22 [5] => /fonction/contacter.php [6] => nom=dsfqfdf ; prenom=qds++q+qdsf ; objet=supprimer+votre+compte ; message=+2e+demande+suppression ;)
Array ( [0] => 32 [1] => 33 [2] => a0b72ed77918e6f18d5fbdcc964982ed [3] => demo@laposte.net [4] => 2009-04-02 14:39:57 [5] => /ventes-flash-prix-promotionnels.php [6] => )
Array ( [0] => 33 [1] => 33 [2] => a0b72ed77918e6f18d5fbdcc964982ed [3] => demo@laposte.net [4] => 2009-04-02 14:41:07 [5] => /fonction/parrainer.php [6] => email_filleul=presse@toto-professionnel.fr ; )

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

Merci @ toutezéatous et excellente soirée !
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 9 avril 2009 à 22:00
3
Merci
Salut Karpediem,

Bravo, c'est une véritable prouesse pour une blonde !!!

Je vais essayer d'être plus clair sur mon dernier commentaire car j'ai l'impression que tu mélanges création d'un fichier et affichage dans le navigateur de l'internaute :
- sortie HTML = ce qui est envoyé à l'utilisateur
- fputcsv écrit des données formatées en csv dans un fichier (sur le serveur), elle n'envoie rien sur la sortie HTML
- echo, readfile, etc ... envoient des données sur la sortie HTML
- header('Content-Type: text/csv) indique au navigateur que les données qui suivent sont formatées en csv









Ainsi ta permière version doit bien enregistrer le fichier sur le serveur (dans le même répertoire que le script) puisque tu ne fais que des fputcsv.
Par contre tu n'as rien lorsque tu appelles la page puisqu'il n'y a pas d'echo ou de readfile.

La question que tu dois te poser est : "ai je besoin de conserver une copie sur le serveur du fichier envoyé ?"
Oui ?
Ne change rien, tu écris bien ton fichier sur le serveur et tu le lis ensuite pour l'envoyer vers la sortie HTML (readfile)

Je pense que dans ton cas la réponse est non. Il est alors inutile d'utiliser des ressources et de perdre du temps avec ça.
Ton code devrait pouvoir se résumer ainsi :


$fname = "tracking.csv" ;
$html_output = '';
$sql = 'SELECT * FROM tracking';if (false $result mysql_query($sql)) die('Impossible de générer le fichier, voici l\'erreur :'.mysql_error());
  
$num_fields = mysql_num_fields($result);
for ($i = 0; $i < $num_fields; $i++) {
  $html_output.= mysql_field_name($result , $i).",";
}
$html_output = substr($html_output,0, -1)."\r\n";

while($row = mysql_fetch_row($result)){
  for ($i=0; $i < $num_fields; $i++) {
    $html_output.= $row[$i].",";
  }
  $html_output = substr($html_output,0, -1)."\r\n";
}

header('Content-Type: text/csv'); ///// J'ai essayé les 2
header('Content-Disposition: attachment; filename="tracking.csv"');
header('Pragma: no-cache');
header('Expires: 0');

echo $html_output;





J'ai supprimer les surplus qu'il y avait dans ton code.
J'ai testé, ça devrait fonctionner.

Très bonne soirée à toi aussi,

Kohntark -

Merci kohntark 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 102 internautes ce mois-ci

Commenter la réponse de kohntark
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 7 avril 2009 à 06:09
0
Merci
Salut,

En fait tu écris dans un fichier (fputcsv) mais pas sur la sortie HTML.
Ton fichier tracking.csv doit être correctement écrit sur le serveur, mais par contre tu n'envoies rien à l'utilisateur.
Il faudrait que tu fasses des echo des données formatées en csv pour que ça fonctionne à la volée.
Ou alors tu génères ton fichier et tu l'envoies sur la sortie HTML après tes header.

Cordialement,

Kohntark -
Commenter la réponse de kohntark
karpediem 49 Messages postés mardi 30 mars 2004Date d'inscription 22 septembre 2014 Dernière intervention - 7 avril 2009 à 11:24
0
Merci
Bonjour Kohntark,

La blonde a encore frappé (c'est moi la blonde ;o)) Je dois t'avouer que je n'ai pas bien compris ce que tu me suggères de faire...

Ce qui est clair, c'est que je n'écris rien dans mon fichier ;-( pourtant, dans la doc, j'avais lu à propos de la fonction fputcsv :
fputcsv — Formate une ligne en CSV et l'écrit dans un fichier

J'ai cru que ça suffisait pour d'une part formater ma ligne au fond format (sans avoir à recréer la chaine avec les séparateurs et tout le tsouin-tsouin) et d'autre part ecrire directement dans mon fichier, mais j'ai peut-être mal interprété et raté une étape...

J'ai aussi pensé que peut-être j'envoyais le header avant que mon csv ne soit réellement généré, alors ce matin j'ai essayé en inversant l'ordre de ma boucle avec mes header (je ne sais pas si c'est ça que tu me suggérais), mais j'obtiens le même résultat...

J'ai aussi essayé de mettre un  fwrite($fp, 'toto'); juste après le fopen et le test if($fp), mais j'ai toujours un fichier vide au final...

En revanche, j'ai mis un echo 'toto'; (comme tu le suggères) avant ma boucle while, et là, ça a bien écrit toto dans mon fichier !

Je n'arrive pas à comprendre pourquoi les instructions d'écriture type fwrite() ou fputcsv() n'écrivent rien dans mon fichier (alors qu'elles sont censées être là pour ça ;o)) et que le echo fonctionne alors que pour moi le echo est destiné au html (je ne sais pas si c'est ça que tu as voulu m'expliquer) et non pour écrire dans un fichier...

Aurais-tu stp une explication ?

Encore un grand MERCI !
Commenter la réponse de karpediem
karpediem 49 Messages postés mardi 30 mars 2004Date d'inscription 22 septembre 2014 Dernière intervention - 9 avril 2009 à 19:15
0
Merci
ça y est, j'ai trouvé, il fallait que j'ajoute l'instruction

    readfile($fname);

zvant le exit() pour qu'effectivement quelque chose soit écrit dans le fichier. Encore une fois, tu m'as mise sur la bonne voie...

Un grand MERCI à tous ceux et celles qui nous aident à réfléchir et tout particulièrerment à Kohntark !

Excellente soirée @ toutezéatous !
Commenter la réponse de karpediem
karpediem 49 Messages postés mardi 30 mars 2004Date d'inscription 22 septembre 2014 Dernière intervention - 10 avril 2009 à 03:32
0
Merci
Trop fort !!!

J'ai testé, c'est ok et en plus la blonde a même compris ;o))

Encore un grand MERCI, je vais pouvoir passer une bonne nuit maintenant que ce pb est résolu ;o))

A bientôt !!
Commenter la réponse de karpediem
fano97one 3 Messages postés jeudi 25 février 2010Date d'inscription 8 mars 2011 Dernière intervention - 7 mars 2011 à 09:48
0
Merci
bonjour,
j'ai copier le script de kohntark mais rien ne s'affiche. je travail sous oracle. voici mon script que j'ai mis dans un fichier appeler creer_csv.php,
doit-je créer un fichier csv avant ou le script le créer automatiquement?
merci pour votre aide.

<?php
session_start();

require_once ("/var/web/dev/mod_oracle/www/_HEAD/oracle.mod.php");
$oConnect = fOraclelogon("TAL", "TAL", "BOBTEST");

$fname = "tracking.csv" ;
$html_output = '';
$sql = "select lc.id# as id_ligne_commande, com.id# as id_commande, com.date_saisie, com.date_prise_en_compte, u.nom||' '||u.prenom as nom_prenom, a.reference as ref_article, a.description as description_article, cat.description as description_categorie, a.prix_unitaire_ht, lc.quantite_article, sum (lc.quantite_article*a.prix_unitaire_ht) as total_article
from t_commande com, t_article a, t_ligne_commande lc, t_categorie cat, t_utilisateur u
where com.id#=lc.commande_id
and u.id#=com.utilisateur_id
and a.id#=lc.article_id
and cat.id#=a.categorie_id
and com.date_prise_en_compte is null
group by lc.id#, com.id#, com.date_saisie, com.date_prise_en_compte, u.nom||' '||u.prenom, a.reference, a.description, cat.description, a.prix_unitaire_ht, lc.quantite_article
order by com.id#";


if (false $result fOracleSqlSelect($oConnect , $sql);

$num_fields = oci_num_fields($result);
for ($i = 0; $i < $num_fields; $i++) {
$html_output.= oci_field_name($result , $i).",";
}
$html_output = substr($html_output,0, -1)."\r\n";

while($row = oci_fetch_row($result)){
for ($i=0; $i < $num_fields; $i++) {
$html_output.= $row[$i].",";
}
$html_output = substr($html_output,0, -1)."\r\n";
}

header('Content-Type: text/csv'); ///// J'ai essayé les 2
header('Content-Disposition: attachment; filename="tracking.csv"');
header('Pragma: no-cache');
header('Expires: 0');

echo $html_output;
?>
Commenter la réponse de fano97one
fano97one 3 Messages postés jeudi 25 février 2010Date d'inscription 8 mars 2011 Dernière intervention - 8 mars 2011 à 16:49
0
Merci
c'est bon j'ai réussit cool! mais le problème maintenant c'est que les cases ne s'ajuste pas automatiquement selon le nombre de caractères.
Quelqu'un aurait t-il la solution svp?
Commenter la réponse de fano97one
fano97one 3 Messages postés jeudi 25 février 2010Date d'inscription 8 mars 2011 Dernière intervention - 8 mars 2011 à 16:54
0
Merci
VOICI MON CODE!

<?php
session_start();

require_once ("/var/web/dev/mod_oracle/www/_HEAD/oracle.mod.php");
$oConnect = fOraclelogon("...", "...", "...");

//on recupere les infos dans la bdd
$sql = "select lc.id# as id_ligne_commande, com.id# as id_commande, com.date_saisie, com.date_prise_en_compte, u.nom||' '||u.prenom as nom_prenom, a.reference as ref_article, a.description as description_article, cat.description as description_categorie, a.prix_unitaire_ht, lc.quantite_article, sum (lc.quantite_article*a.prix_unitaire_ht) as total_article
from t_commande com, t_article a, t_ligne_commande lc, t_categorie cat, t_utilisateur u
where com.id#=lc.commande_id
and u.id#=com.utilisateur_id
and a.id#=lc.article_id
and cat.id#=a.categorie_id
and com.date_prise_en_compte is null
group by lc.id#, com.id#, com.date_saisie, com.date_prise_en_compte, u.nom||' '||u.prenom, a.reference, a.description, cat.description, a.prix_unitaire_ht, lc.quantite_article
order by com.id#";

$result = fOracleSqlSelect($oConnect , $sql, $aTabSql);

if(sizeof($aTabSql)>0)
{
//Si au moins une ligne est retournée
$contenu='COMMANDE N°,DATE DE LA COMMANDE,PERSONNE,REFERENCE,ARTICLE,CATEGORIE,PRIX U HT,QUANTITE,TOTAL'."\r\n";

for($i=0;$i<sizeof($aTabSql);$i++)
{
if (preg_match("#^,#", $aTabSql[$i]["PRIX_UNITAIRE_HT"]))
{	
$aTabSql[$i]["PRIX_UNITAIRE_HT"] = preg_replace('#,#', '0.',$aTabSql[$i]["PRIX_UNITAIRE_HT"]);
}
if (preg_match("#,#", $aTabSql[$i]["PRIX_UNITAIRE_HT"]))
{	
$aTabSql[$i]["PRIX_UNITAIRE_HT"] = preg_replace('#,#', '.',$aTabSql[$i]["PRIX_UNITAIRE_HT"]);
}
if (preg_match("#^,#", $aTabSql[$i]["TOTAL_ARTICLE"]))
{
$aTabSql[$i]["TOTAL_ARTICLE"] = preg_replace('#,#', '0.',$aTabSql[$i]["TOTAL_ARTICLE"]);
}
if (preg_match("#,#", $aTabSql[$i]["TOTAL_ARTICLE"]))
{
$aTabSql[$i]["TOTAL_ARTICLE"] = preg_replace('#,#', '.',$aTabSql[$i]["TOTAL_ARTICLE"]);
}

}


//$contenu = "";
for($i=0;$i<sizeof($aTabSql);$i++)
{
$contenu = $contenu.$aTabSql[$i]["ID_COMMANDE"]
.",".$aTabSql[$i]["DATE_SAISIE"]
.",".$aTabSql[$i]["NOM_PRENOM"]
.",".$aTabSql[$i]["REF_ARTICLE"]
.",".strip_tags(stripslashes($aTabSql[$i]["DESCRIPTION_ARTICLE"]))
.",".strip_tags(stripslashes($aTabSql[$i]["DESCRIPTION_CATEGORIE"]))
.",".$aTabSql[$i]["PRIX_UNITAIRE_HT"]
.",".$aTabSql[$i]["QUANTITE_ARTICLE"]
.",".$aTabSql[$i]["TOTAL_ARTICLE"]."\r\n";
}

$file="commandes.csv";
$fp=fopen($file,"w" ); // ouverture du fichier
fputs($fp,$contenu); // enregistrement des données ds le fichier
fclose($fp);
header("Content-Type: application/force-download" );
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=".$file);
readfile($file);
unlink($file);
}

?>
Commenter la réponse de fano97one

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.