webentwicklung-frage-antwort-db.com.de

Wie man fputcsv veranlasst, die Daten "zurückzugeben"

Ich brauche eine Möglichkeit, die Funktion fputscv dazu zu bringen, Daten im laufenden Betrieb in den Browser zu schreiben, anstatt eine temporäre Datei zu erstellen, Daten in dieser Datei zu speichern und eine echo file_get_contents() auszuführen.

27
Salman A

Fand dies auf der PHP docs-Website, erster Kommentar unter der Funktionsreferenz:

function outputCSV($data) {
  $outstream = fopen("php://output", 'w');
  function __outputCSV(&$vals, $key, $filehandler) {
    fputcsv($filehandler, $vals, ';', '"');
  }
  array_walk($data, '__outputCSV', $outstream);
  fclose($outstream);
}

Und eine zweite Option:

$csv = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');
fputcsv($csv, array('blah','blah'));
rewind($csv);

// put it all in a variable
$output = stream_get_contents($csv);

Hoffe das hilft!

Übrigens sollten die PHP -Dokumente immer Ihre erste Anlaufstelle sein, wenn Sie versuchen, etwas herauszufinden. :-)

42
Seb Barre

Durch einen Kommentar auf der PHP Website

<?php
$out = fopen('php://output', 'w');
fputcsv($out, array('this','is some', 'csv "stuff", you know.'));
fclose($out);
?>
16
powtac

Da der ursprüngliche Fragesteller "on the fly in den Browser schreiben" wollte, ist es vielleicht erwähnenswert (wie in meinem Fall und niemand erwähnt), dass Sie einen Dateinamen und einen Dialog erzwingen möchten, in dem Sie aufgefordert werden, eine Datei in den Browser herunterzuladen , müssen Sie die richtigen Header setzen, bevor Sie etwas mit fputcsv ausgeben:

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

Das Erstellen einer CSV ist eigentlich gar nicht so schwierig (das Parsen einer CSV ist etwas komplizierter).

Beispielcode zum Schreiben eines 2D-Arrays als CSV:

$array = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
];

// If this CSV is a HTTP response you will need to set the right content type
header("Content-Type: text/csv"); 

// If you need to force download or set a filename (you can also do this with 
// the download attribute in HTML5 instead)
header('Content-Disposition: attachment; filename="example.csv"')

// Column heading row, if required.
echo "Column heading 1,Column heading 2,Column heading 3\n"; 

foreach ($array as $row) {
    $row = array_map(function($cell) {
        // Cells containing a quote, a comma or a new line will need to be 
        // contained in double quotes.
        if (preg_match('/["\n,]/', $cell)) {
            // double quotes within cells need to be escaped.
            return '"' . preg_replace('/"/', '""', $cell) . '"';
        }

        return $cell;
    }, $row);

    echo implode(',', $row) . "\n";
}
0
Lee Kowalkowski