2017-04-01 1 views
0

Ich habe den folgenden Code, wo ich Zufallszahlen generieren und versuchen, sie als CSV-Datei herunterladen.PHP-Code zum Herunterladen CSV-Datei funktioniert nicht

Wenn ich das CSV-Code-Snippet allein auf einer anderen Datei versuchen, funktioniert es, aber in diesem Code funktioniert es einfach nicht. Ich sehe zwar die Zufallszahlen, aber die CSV-Datei wird nicht heruntergeladen.

<?php 

$dataarray=array(); 

function convert_to_csv($input_array, $output_file_name, $delimiter) 
{ 
$temp_memory = fopen('php://memory', 'w'); 
foreach ($input_array as $line) 
{ 
fputcsv($temp_memory, $line, $delimiter); 
} 

fseek($temp_memory, 0); 
header('Content-Type: application/csv'); 
header('Content-Disposition: attachement; filename="' . $output_file_name . '";'); 
fpassthru($temp_memory); 
} 

for ($i = 0; $i <= 25000; $i++) 
{ 
    $num = (rand(50,110)); 

    array_push($dataarray,"$num"); 

    echo "Hearbeat #" .$i . "\t\t ------ " . $num; 
    echo "<br>"; 
} 

convert_to_csv($dataarray, 'data_as_csv.csv', ','); 

?> 

Antwort

1

Datenausgabe vor Senden Header mit header() bedeutet, dass header() Anrufe keine Wirkung haben wird. Es ist also vernünftig, vor Kopfzeilen nichts zu senden.

Als eine andere Antwort erwähnt - zweites Argument zu fputcsv muss Array sein, so änderte ich den Anruf zu fputcsv auch.

Wenn Sie alle Werte wollen als Separator mit Komma CSV-Datei geschrieben - pass $input_array direkt an fputcsv.

So können Sie Ihren Code wie folgt aussehen:

<?php 
$dataarray=array(); 

function convert_to_csv($input_array, $output_file_name, $delimiter) 
{ 
$temp_memory = fopen('php://memory', 'w'); 

// Option 1 - every number will be on a new line 
foreach ($input_array as $line) 
{ 
// add `array($line)` not `$line` 
fputcsv($temp_memory, array($line), $delimiter); 
} 

// Option 2 - all numbers will be in 
// one line with `$delimiter` as separator 
fputcsv($temp_memory, $input_array, $delimiter); 

fseek($temp_memory, 0); 
header('Content-Type: application/csv'); 
header('Content-Disposition: attachement; filename="' . $output_file_name . '";'); 
fpassthru($temp_memory); 
} 

for ($i = 0; $i <= 25000; $i++) 
{ 
    $num = (rand(50,110)); 
    array_push($dataarray,"$num"); 

    // this two lines are nor needed 
    //echo "Hearbeat #" .$i . "\t\t ------ " . $num; 
    //echo "<br>"; 
} 

convert_to_csv($dataarray, 'data_as_csv.csv', ','); 
+0

vielen Dank. 1- Ich möchte, dass die Werte auf dem Bildschirm erscheinen, also brauche ich die Echos, aber wenn ich sie einfüge, wird der Download der Datei gestoppt. + Die Werte sind nicht durch Kommas in der generierten Datei getrennt. – tony9099

+1

Sie müssen verstehen, dass es nur __eine__ Option gibt - entweder Datei herunterladen oder Webseite anzeigen. Es gibt __NO__ Wege, beides in PHP zu tun. –

+0

Wenn Sie Werte benötigen, die durch Kommas getrennt sind, dann wie @gmc sagte - übergeben Sie $ input_array an fputcsv. –

0

Eigentlich ist das Problem in Ihrer convert_to_csv Funktion. fputcsv erwartet, dass der zweite Parameter ein Array ist und in Ihrem Fall eine Zeichenfolge ist. Sie haben 2 Möglichkeiten, je nachdem, was Sie wollen:

1) Jede Zahl in einer separaten Zeile: fputcsv($temp_memory, [$line], $delimiter);

2) in der gleichen Zeile von $delimiter getrennt Alle Zahlen: nur den fputcsv Funktionsaufruf ändern

Und (ich bin sicher, dass Sie bereits wissen), für die Datei automatisch heruntergeladen werden müssen Sie nicht echo nichts.

+0

Im Ernst - Sie alle Werte aus einem Array 'setzen fields' $ input_array' auf ein anderes Array' $? Warum? –

+0

Richtig, wie dumm von mir ... Danke – gmc

Verwandte Themen