fputcsv вставляет пустую строку в начало .csv

<?php

$filename="backup_".date('m/d/Y', time()).".csv";

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');

$q=mysqli_query($conn,"SELECT * FROM visitordb");
$file = fopen('php://output','w');
if(mysqli_num_rows($q)>0) {
    while($res = $q->fetch_assoc()) {
        $datas = $res["sno"].','.$res["UDID"].','.$res["taggnumber"].','.$res["name"].','.$res["designation"].','.$res["company"].','.$res["email"];
        fputcsv($file, explode(',', $datas));
    }
} else {

}

fclose($file);
}

Приведенный выше код создает пустую строку в начале файла .csv при просмотре в MS Excel. Еще одна вещь, файл .csv также генерирует любой HTML-код на странице.


person warelord    schedule 17.05.2013    source источник
comment
Убедитесь, что у вашего скрипта нет других выходных данных, и выйдите после закрытия $file   -  person Mark Baker    schedule 17.05.2013
comment
Не полагайтесь на Excel, чтобы узнать, как выглядит CSV. Как выглядит .csv?!   -  person deceze♦    schedule 17.05.2013
comment
Попробуйте просто сохранить файл на диск и посмотреть, есть ли в начале пустая строка.   -  person Viktor S.    schedule 17.05.2013
comment
Кроме того, не могли бы вы объяснить последнее утверждение в вашем вопросе? Тот про HTML   -  person Viktor S.    schedule 17.05.2013
comment
Спасибо всем .. Да, я пробовал предложения, но все равно без изменений.. В CSV есть пустая строка в начале.. HTML означает тег ‹html› и т. д..   -  person warelord    schedule 17.05.2013
comment
Итак, вы говорите, что пытались сделать $file = fopen('test.csv','w'); ... , а в этом файле на сервере все еще была пустая строка? Вы проверили, нет ли у вас пустой строки в базе данных?   -  person Viktor S.    schedule 17.05.2013


Ответы (1)


что произойдет, если вы удалите директивы заголовка? Вы должны знать, что заголовки по определению заключаются в новую строку. Я мог представить, что это конфликт \n против \r\n.

Если ничего не получается, поместите весь вывод в буфер и обрежьте его позже:

ob_start();
...your code...
$out = ob_get_contents();
ob_end_clean();
echo trim($out);

С наилучшими пожеланиями

Жолт

person Zsolt Szilagyi    schedule 17.05.2013
comment
пожалуйста. Остерегайтесь, что обрезка также удаляет конечные пробелы. Используйте другие манипуляции со строками, если вам нужно сохранить CSV на 100% безопасным. - person Zsolt Szilagyi; 18.05.2013
comment
@Zsolt Szilagy köszönöm. У меня была та же проблема, и я не знал, что директивы заголовка добавляют новую строку. В моем случае я записал свой вывод во временный файл (tmpfile() php), поэтому мне нужно было только сделать ob_end_clean(); прежде чем перебирать мой файл и повторять его. - person BryanT; 09.02.2016