Fputcsv me génère un fichier vide ;-((

Résolu
karpediem Messages postés 49 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 22 septembre 2014 - 6 avril 2009 à 23:00
fano97one Messages postés 3 Date d'inscription jeudi 25 février 2010 Statut Membre Dernière intervention 8 mars 2011 - 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 !

8 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
9 avril 2009 à 22:00
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 -
3
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
7 avril 2009 à 06:09
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 -
0
karpediem Messages postés 49 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 22 septembre 2014
7 avril 2009 à 11:24
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 !
0
karpediem Messages postés 49 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 22 septembre 2014
9 avril 2009 à 19:15
ç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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
karpediem Messages postés 49 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 22 septembre 2014
10 avril 2009 à 03:32
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 !!
0
fano97one Messages postés 3 Date d'inscription jeudi 25 février 2010 Statut Membre Dernière intervention 8 mars 2011
7 mars 2011 à 09:48
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;
?>
0
fano97one Messages postés 3 Date d'inscription jeudi 25 février 2010 Statut Membre Dernière intervention 8 mars 2011
8 mars 2011 à 16:49
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?
0
fano97one Messages postés 3 Date d'inscription jeudi 25 février 2010 Statut Membre Dernière intervention 8 mars 2011
8 mars 2011 à 16:54
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);
}

?>
0
Rejoignez-nous