【问题标题】:fputcsv generates line without newlinefputcsv 生成没有换行符的行
【发布时间】:2021-10-07 17:42:30
【问题描述】:

这里是删除了 SQL 部分的代码完整代码。我希望它开始下载带有数据库数据的 CSV 文件。但是当我 foreach csv 数组时,它出乎意料地以几乎正确的格式打印所有数据,但忽略换行符并放置 ' '(空格)。

$csv = array(
    array('RECID', 'UID', 'Amount', 'Sumbit Date') 
);

while($row = mysql_fetch_row($results)) // SQL query isn't reason 100%
{
    $csv[] = array($row[0], $row[1], $row[2], $row[3]);
}

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

//this part is unexpected
foreach($csv as $line){
    fputcsv($fp, $line);
}

header("Cache-Control:maxage=1");
header("Pragma: public");
header("Content-Type:text\csv; charset=UTF-8" );
header('Content-Disposition: attachment; filename=csv.csv');

fpassthru($fp);

fclose($fp);

如果更改 foreach 循环并逐行调用 fputcsv 元素,则一切正常。下载开始,CSV 工作正常。

fputcsv($fp, $csv[0]);
fputcsv($fp, $csv[1]);
fputcsv($fp, $csv[2]);

但是,当您尝试使用任何循环遍历数组时,它会忽略换行符并输出不带换行符但以 ' ' 作为换行符分隔符的数据。另外它不下载它只是在浏览器中打印所有数据。

foreach($csv as $line){
    fputcsv($fp, $line);
}

如何解决这个问题,以使我的脚本按预期工作(添加换行符并开始下载)?

【问题讨论】:

  • 警告: mysql_* 扩展自 PHP 5.5.0 起已弃用,自 PHP 7.0.0 起已被删除。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅 MySQL API Overview 以获得更多帮助。
  • @Dharman 这真是个老项目。正如我所说,SQL 不是意外输出的原因。

标签: php foreach fputcsv


【解决方案1】:

有一个未知的错误,当你逐行放置 fputcsv 时,你写它的位置并不重要,但是,如果你在循环中执行,循环必须在所有标题之后!

header("Cache-Control:maxage=1");
header("Pragma: public");
header("Content-Type:text\csv; charset=UTF-8" );
header('Content-Disposition: attachment; filename=csv.csv');

for($i = 0; $i < count($csv); $i++){
    fputcsv($fp, $csv[$i]);
}

【讨论】: