Bonjour à tous,

Je suis actuellement en train d'essayer de faire une création de fichier CSV suite à une requête, mon code fonctionne parfaitement en local sous easyPHP (une fenetre s'ouvre et me propose d'afficher ou de télécharger mon fichier csv) mais lorsque je test en prod sur serveur cela me fait simplement un echo de la requête dans la page.

Je bloque complètement là... Vous avez une idée ?

Merci d'avance !

Voici mon code:

        $sql_export = "SELECT * FROM encaissements WHERE timestamp<$timestamp2 AND timestamp>$timestamp1 ORDER BY id DESC";
        $result_export = mysql_query($sql_export);
        mysql_close();
        echo "
            <form action='' method='post' enctype='multipart/form-data'>
            <input type='submit' name='export' value='EXPORTER LES RESULTATS DANS UN CSV'/></form>
            ";
            if (isset($_POST['export'])) {
                $outputCsv = '';
                $fileName = "manifnew_";
                $fileName .= date('Y-m-d_H:i:s');
                $fileName .= ".csv";
                ob_clean();
                if (mysql_num_rows($result_export) > 0) {
                    $i = 0;
                    while ($row_export = mysql_fetch_assoc($result_export)) {
                        $i++;
                        if ($i == 1) {
                            foreach ($row_export as $clef => $valeur)
                                $outputCsv .= trim($clef) . ';';
                                $outputCsv = rtrim($outputCsv, ';');
                                $outputCsv .= "\n";
                        }
                        foreach ($row_export as $clef => $valeur)
                            $outputCsv .= trim($valeur) . ';';
                            $outputCsv = rtrim($outputCsv, ';');
                            $outputCsv .= "\n";
                    }
                } else {
                    exit('Aucune données à exporter');
                }
                header("Content-disposition: attachment; filename=" . $fileName);
                header("Content-type: application/vnd.ms-excel");
                header("Content-Transfer-Encoding: application/vnd.ms-excel\n");
                header("Pragma: no-cache");
                header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
                header("Expires: 0");
                echo"\xEF\xBB\xBF";
                echo $outputCsv;
                exit();   
            }
  ?>

13 réponses


Hello,

Quel est la version de PHP sur ton serveur ?

Jenjak
Auteur

Salut PallMallShow, c'est la Version 5.4.16

Hmm, qu'entends tu par "Un echo de la requête de la page" ?

Jenjak
Auteur

Quand j'appuie sur le submit "export", au lieu de m'ouvrir une fenetre avec le nom du csv en me proposant d'afficher ou d'enregistrer comme en local, il se contente simplement d'afficher en dessous du bouton

id;date;destinataire;mode;origine;montant;objet;objet1;objet2;objet3;objet4;objet5;observations;redacteur;redacteur_maj;timestamp;timestamp_maj;pdf 5;12/02/2016;testt;virement;DIVERS;350,21;ANGEL 21;BERNARD 329,21;;;;;;Mme test;;1455291386;1455291386;5-1455291386.pdf 3;12/02/2016;testt;espèces;Test origine;555,98;test objet;ici l'objet numéro 2;;;;;;Mme test;Mme test;1455290155;1455290291;3-1455290155.pdf 2;12/02/2016;test;espèces;Test origine;350,55;test objet 1;test objet 2;;;;;;Mme test;Mme test;1455287784;1455289405;2-1455287784.pdf

Il s'agit en fait d'un soucis sur ton echo $csv;. Ce n'est pas la bonne méthode.
Essai peut être simplement de te renseigner ici : http://knackforge.com/blog/vishnu/creating-downloadable-csv-files-php

Jenjak
Auteur

Merci pour la réponse ! Par contre je suis désolé mais je ne comprend pas bien le déroulement en partant de la base de mon code... :/

Je verrais ça (en remplacement du premier header() jusqu'au exit() compris) !

file_put_contents('/tmp/export.csv', $csv); //On créer / écrase un fichier dans tmp/export.csv
header("Content-type: text/csv"); //On définit le header pour un fichier CSV
header("Content-disposition: attachment; filename = export.csv"); //Force le navigateur a afficher la fenêtre de sauvegarde
readfile("/tmp/export.csv");
Jenjak
Auteur

Ah ok je vois ! j'ai bien un fichier excel avec le bon contenu qui se créé sur le serveur, par contre le readfiles("./csv/test.csv") fait la meme chose que l'echo, il affiche tout sur la meme page comme 4 posts au dessus et le navigateur ne me propose pas de téléhcragement :|

Hmm, essai de trifouiller un peu en t'aidant de ça : http://php.net/manual/fr/function.readfile.php

Jenjak
Auteur

Oui je suis dessus ! :)

Je vais essayer de voir ou ça bloque, je tiens au courant, en tous cas merci !

Jenjak
Auteur

Mmmmh, j'ai beau retourner le truc dans tous les sens ça ne fonctionne pas, mon fichier test.csv se créé bien dans le rep ./csv/test.csv, je passe la condition if (file...exists($file) parfaitement, mais le readfile encore une fois se contente d'afficher les résultats sur la page en bloc

J'ai pourtant suivi Exemple #1 Forcer le téléchargement en utilisant readfile() du manuel PHP et tout devrait pourtant fonctionner

Si vous avez des idées je suis preneur !

Jenjak
Auteur
          if (isset($_POST['export'])) {
                $outputCsv = '';
                ob_clean();
                if (mysql_num_rows($result_export) > 0) {
                    $i = 0;
                    while ($row_export = mysql_fetch_assoc($result_export)) {
                        $i++;

                        if ($i == 1) {
                            foreach ($row_export as $clef => $valeur)
                                $outputCsv .= trim($clef) . ';';
                                $outputCsv = rtrim($outputCsv, ';');
                                $outputCsv .= "\n";
                        }
                        foreach ($row_export as $clef => $valeur)
                            $outputCsv .= trim($valeur) . ';';
                            $outputCsv = rtrim($outputCsv, ';');
                            $outputCsv .= "\n";
                    }
                } else {
                    exit('Aucune données à exporter');
                }

                file_put_contents('./csv/test.csv', $outputCsv); //On créer / écrase un fichier dans tmp/export.csv

                $file = './csv/test.csv';   

                if (file_exists($file)){
                    header('Content-Description: File Transfer');
                    header('Content-Type: application/octet-stream');
                    header('Content-Disposition: attachment; filename="'.basename($file).'"');
                    header('Expires: 0');
                    header('Cache-Control: must-revalidate');
                    header('Pragma: public');
                    header('Content-Length: ' . filesize($file));
                    readfile($file);
                    exit;
                }
            }
Jenjak
Auteur

Hello, du coup vu que sur serveur ça ne fonctionne pas je me suis résigné à générer le CSV, le stocker dans un dossier et faire apparaitre un lien pour le télécharger, c'est une manip' de plus mais ça fonctionne aussi bien, merci pour tes conseils PallMalShow :)