質問

I have problem with writing csv file using fputcsv. Its putting the page html also into the csv file. Whats wrong with my code ?

//Excel header
header("Content-Disposition: attachment; filename=\"Delivery_Reports.csv\";" );
header("Content-type: application/vnd.ms-excel");
$out = fopen("php://output", 'w');
$flag = false;
// $result = mysql_query("SELECT * FROM senderids ") or die('Query failed!');
//$sel="SELECT number as MobileNumber ,snum as Sender , msg as Subject ,crdate as Date ,status FROM savemsg WHERE userID='".$_SESSION['id']."' ".$str." ORDER BY sn DESC ";
$result = mysql_query("SELECT `count`, `dnd`, `credit`, `sender_id`, `to`, `message`, `status` FROM `reports` WHERE `unq_id` = '$dlr_id'");
while(false !== ($row = mysql_fetch_assoc($result))){
    if(!$flag){
        $list = array(
            "Total"=>"Total",
            "DND"=>"DND",
            "Credits"=>"Credits",
            "From"=>"From",
            "To"=>"To",
            "Message"=>"Message",
            "Status"=>"Status"
        );
        // display field/column names as first row
        fputcsv($out, array_keys($list), ',', '"');
        $flag = true;
    }
    // array_walk($row, 'cleanData');
    fputcsv($out, array_values($row), ',', '"');
}
fclose($out);
役に立ちましたか?

解決

You can't guarantee, from within a snippet of code, that nothing else will be output. If the code before this snippet is using output buffering, you can discard the HTML using ob_end_clean. If the code after this snippet is causing the problem, you can simply call die to keep it from running at all. However, if the code before this snippet is outputting HTML directly to the browser, or the code after it outputs HTML and absolutely has to run, then you'll have to modify that code in order to solve your problem.

As Tim mentioned, print, echo and outputting to the pseudo-file php://output do exactly the same thing.

他のヒント

You can also use the keyword continue just before you close the file (fclose($f);). This also works lovely.

You can also use exit; after fclose($out); which stopped the output from scraping my html.

I know it's an old question but it gets found in Google so adding this.

If the HTML is being output by the CMS such as WordPress etc. before you try to create the file, it might help to add ob_clean(); and ob_start(); before you output the header.

For example:

function create_csv($records, $columns){
    ob_clean();
    ob_start();
    header('Content-Type: application/csv');
    header('Content-Disposition: attachment; filename="Export.csv"');
    $fp = fopen('php://output', 'w+');
    // Generate the file content.
    fclose($fp);
    die();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top