下载CSV文件的PHP代码不起作用
我有下面的代码,在这里我生成随机数并尝试将它们作为CSV文件下载下载CSV文件的PHP代码不起作用,php,csv,Php,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, $delimit
<?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', ',');
?>
如果我在另一个文件上单独尝试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', ',');
?>
事实上,问题出在您的
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);
}
而且(我相信您已经知道),要自动下载文件,您必须在发送带有header()
的头文件之前echo
任何内容。输出数据,这意味着header()
调用将产生无效果。因此,在邮件头之前不发送任何内容是合理的
正如前面提到的另一个答案,fputcsv
的第二个参数必须是array,因此我也将调用更改为fputcsv
如果要将所有值以逗号作为分隔符写入csv文件,请将$input\u 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', ',');
严重-您将所有值从一个数组$input\u数组
放到另一个数组$fields
?为什么?非常感谢。1-我希望这些值出现在屏幕上,所以我需要一些回音,但是如果把它放在屏幕上,就会停止文件的下载这些值在生成的文件中不以逗号分隔。您必须了解只有一个选项-下载文件或查看网页。在php中,这两种方法都无法实现。如果您需要用逗号分隔的值,那么正如@gmc所说的,将$input\u array
传递到fputcsv
。