3

我在使用 fputcsv 编写 csv 文件时遇到问题。它将页面 html 也放入 csv 文件中。我的代码有什么问题?

//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);
4

4 回答 4

7

您不能保证在一段代码中不会输出任何其他内容。如果此代码段之前的代码使用输出缓冲,您可以使用ob_end_clean丢弃 HTML 。如果这段代码之后的代码导致了问题,你可以简单地调用die来阻止它运行。但是,如果此代码段之前的代码直接将 HTML 输出到浏览器,或者它输出 HTML 之后的代码必须运行,那么您必须修改该代码才能解决您的问题。

正如蒂姆所提到的,printecho和输出到伪文件 php://output做的事情完全相同。

于 2012-08-16T22:27:22.623 回答
0

您也可以continue在关闭文件之前使用关键字 ( fclose($f);)。这也很可爱。

于 2014-07-24T07:45:13.640 回答
0

您还可以使用exit;after fclose($out);which 停止抓取我的 html 的输出。

于 2019-11-25T22:14:49.827 回答
0

我知道这是一个老问题,但它可以在 Google 中找到,所以添加这个。

如果在您尝试创建文件之前由 CMS(如 WordPress 等)输出 HTML,则在输出标题之前添加可能会有所ob_clean();帮助ob_start();

例如:

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();
}
于 2019-12-05T11:39:28.187 回答