2012-11-09 4 views
1

J'ai déjà vu cela auparavant et j'ai de la difficulté à le faire fonctionner correctement après avoir essayé un certain nombre de solutions. Le problème est que je ne peux pas exporter correctement mes données dans un format csv. Avant d'ajouter mon ob_end_clean, je l'exportais vers un csv avec html, maintenant il ne me donne pas de csv, juste du texte.Mon exportation csv affichant html, comment se débarrasser de?

Voici mon code sur le fichier qui est requis.

if (isset($_POST["hidden"])) { 

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'), 
    array('123', '456', '789'), 
    array('"aaa"', '"bbb"') 
); 

    $fp = fopen('php://output','w'); 

    foreach ($list as $row) { 
     ob_end_clean(); 
     fputcsv($fp, $row); 
    } 

    header('Content-Type: text/csv; charset=utf-8'); 
    header('Content-Disposition: attachment; filename=data.csv'); 

} 

En ce moment, quand je fais mon exportation, les données obtient remettre sur l'écran similaire à un var_dump(). Je veux simplement que cela se passe dans un fichier csv sans avoir le html partout.

+0

Avez-vous du code HTML brut avant cet extrait de code? Avez-vous essayé de déplacer le ob_end_clean() avant la sortie foreach/CSV? – mario

+0

Ouais j'ai un besoin sur un autre fichier qui fait écho à certains html. – wowzuzz

+1

Eh bien, vous ne devriez faire qu'une seule chose, soit générer une page HTML ** ou ** CSV de sortie. Déplacez le code CSV dans un script séparé. – mario

Répondre

11

Ça a marché! J'ai invoqué mon code csv avant tout sur la page. :) Ensuite, j'ai fait ma connexion à ma table, puis a fait ma logique pour mon code. Je n'avais pas de ob_start ou ob_flush sur mon fichier principal ce qui a fait une grande différence. J'ai eu le ob_clean avant la boucle while et ensuite j'ai fait un exit() après avoir déclaré l'en-tête. J'espère que cela l'explique bien.

Voici mon code.

if (isset($_POST["hidden"])) { 
    $sql = "SELECT * FROM `newsletter`"; 
    $result = mysql_query($sql); 

    ob_end_clean(); 

    $fp = fopen('php://output','w'); 

    while ($list = mysql_fetch_assoc($result)) { 
     fputcsv($fp, $list); 
    } 

    header('Content-Type: text/csv; charset=utf-8'); 
    header('Content-Disposition: attachment; filename=data.csv'); 

    exit(); 
} 
+2

Merci d'avoir posté la réponse. Tu as sauvé ma journée. – mokiSRB

1

Place, ob_end_clean(); avant de sortir le csv.

ob_end_clean() signification: "Nettoyer (effacer) le tampon de sortie et désactiver la mémoire tampon de sortie" - Manuel PHP.

0

La logique pour que cela fonctionne est de construire votre script php de manière à:

  1. premiers échos tout le html/javascript ... contenu destiné à la page du navigateur comme echo "<html...>;" (celui-ci utilise déjà la sortie de php tampon derrière les scènes)
  2. après cela nettoie le tampon de sortie de php jusqu'à présent, avec ob_end_clean() (en fonction comment ob_start() a été appelé cela peut empêcher l'exportation précédente) ou ob_clean() qui envoie juste le contenu jusqu'ici au navigateur et nettoie le tampon sans l'éteindre.
  3. utilise à nouveau ce tampon de sortie propre pour exporter tout autre contenu (en tant que csv téléchargeable dans notre cas) vers le navigateur, comme indiqué ci-dessus par wowzuzz. Donc, si n'importe quel html est répercuté par le script après cela, il sera également inclus dans le csv.
Questions connexes