#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]);
}