2017-04-01 92 views
0

我有下面的代碼,在那裏我生成隨機數並嘗試將它們下載爲CSV文件。PHP代碼下載CSV文件不起作用

如果我嘗試在不同的文件時,它單獨工作片斷中,CSV代碼,但在這段代碼,它只是不工作。我確實看到了隨機數字,但它不下載CSV文件。

<?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', ','); 

?> 

回答

1

輸出數據的步驟以前header()發送標題意味着header()通話將沒有效果。因此,不要在標題前發送任何內容。

作爲提到的另一個答案 - fputcsv的第二個參數必須是數組,所以我也改變了電話fputcsv

如果要將所有值寫入以逗號分隔的csv文件 - 將$input_array直接傳遞給fputcsv

所以,你的代碼可以是這樣的:

<?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

非常感謝。 1-我希望這些值出現在屏幕上,所以我需要回聲,但放置它會停止文件的下載。 +在生成的文件中,值不會被逗號分隔。 – tony9099

+1

您__必須瞭解只有__one__選項 - 可以下載文件或查看網頁。有__NO__的方式來做這兩個在PHP中。 –

+0

如果您需要用逗號分隔的值,則@gmc表示 - 將'$ input_array'傳遞給'fputcsv'。 –

0

其實問題出在你的convert_to_csv函數中。 fputcsv期望第二個參數是一個數組,在你的情況下是一個字符串。你必須根據你想要的2種選擇:

1)在一個單獨的行每號:只是改變了fputcsv函數調用:fputcsv($temp_memory, [$line], $delimiter);

2)所有數字由$delimiter分開同一行:

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

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

(我確定你已經知道了),對於要自動下載的文件,你一定不要echo什麼。

+0

認真 - 你把所有的值從一個陣列'$ input_array'到另一個陣列'$ fields'?爲什麼? –

+0

對,我多麼傻...謝謝 – gmc