fputcsv генерирует строку без новой строки

#php #foreach #fputcsv

Вопрос:

Вот полный код кода с удаленной частью SQL. Я ожидаю, что он начнет загружать CSV-файл с данными из базы данных. Но когда я загружаю массив 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:textcsv; 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);
}
 

Как это исправить, чтобы мой скрипт работал должным образом (ввод новых строк и запуск загрузки)?

Комментарии:

1.Предупреждение: mysql_* расширение устарело с версии PHP 5.5.0 и было удалено с версии PHP 7.0.0. Вместо этого следует использовать расширение mysqli или PDO_MySQL. Смотрите также Обзор API MySQL для получения дополнительной помощи при выборе API MySQL.

2. @Dharman это действительно старый проект. Как я уже сказал, SQL не является причиной неожиданного вывода.

Ответ №1:

Была неизвестная ошибка, когда вы строчно помещаете fputcsv, не важно, где вы это пишете, однако, если вы делаете это в цикле, цикл должен быть ПОСЛЕ всех заголовков!

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

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