I have SQL query that exports data to a CSV. All works well until I go below a certain amount of data in the export.

When I go below this threshold, the records are exported followed by the html of the page.

If I add more characters on the header.html the problem is resolved. Ive tested and retested this, and one character of text anywhere on the html page is the difference between exporting the entire html or just the records.

It sounds too weird to be true, I am hoping someone has experienced something similar and can tell me where to look or what specific part of my code I should be pasting here:

Here is the fputcsv part:

if(isset($_SESSION['query_file']))
{
$query = $_SESSION['query_file'];
unset($_SESSION['query_file']);

$stmt = $dbh->query($query);

$results = $stmt->fetchAll();

$link = 'csv/'. Utils::rand_code(10).'.csv' ;

$fp = fopen(SITE_ROOT.$link,'w');
$first_row = array(
    'Name',
    'ID',
    'Email',
    'Response',
    'Phone'
);

fputcsv($fp, $first_row);

foreach($results as $key=>$value)
{


    $array_add = array(
        $value['user_last_name'].''.$value['user_first_name'],
        $value['user_id'],$value['user_email'],$value['user_response'],
        $value['user_phone']
    );

    fputcsv($fp, $array_add);

};

fclose($fp);

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Length: ". filesize(SITE_ROOT.$link).";");
header("Content-Disposition: attachment; filename=".$link);
header("Content-Type: application/octet-stream; "); 
header("Content-Transfer-Encoding: binary");

readfile(SITE_ROOT.$link);

unlink(SITE_ROOT.$link);
}   

Thanks in advance.

有帮助吗?

解决方案

Adding a die(); after your call to unlink(SITE_ROOT.$link); should prevent the rest of the page from executing and thus mucking up your CSV with HTML.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top