【问题标题】:During CSV downloading - Warning: Cannot modify header information - headers already sent by (output started at在 CSV 下载期间 - 警告:无法修改标头信息 - 标头已发送(输出开始于
【发布时间】:2016-02-02 16:25:09
【问题描述】:

下面的小演示代码运行成功

<?php
$list = array
(
"ID,Name,Preview,Payout",
"Peter,Griffin,Oslo,Norway",
"Glenn,Quagmire,Oslo,Norway",
);
$today_doc=date("Y-m-d").".csv";
$file = fopen($today_doc,"w");

foreach ($list as $line)
  {
  fputcsv($file,explode(',',$line));
  }
  fclose($file); 
// We'll be outputting a csv
header('Content-type: text/csv');
// It will be called contacts.csv
header('Content-Disposition: attachment; filename="'.$today_doc.'"');
// The PDF source is in original.csv
readfile($today_doc);?>

我在我的脚本中使用了上面的演示代码,但它不起作用。说-> 警告:无法修改标头信息 - 标头已由(输出开始于

    $selected_ids=$_POST['selected_id'];
    $xyz="";
    $list = array
    ("ID,Offer Name,Emp,salary");
    $i=0;
    foreach($selected_ids as $id)
        {
            $xyz.=$id.',';
        }
        $xyz=trim($xyz,',');
    $extract=mysqli_query($con,"SELECT * FROM `emp_record` WHERE id in ($xyz)") or die(mysqli_error($con));
    while($row = mysqli_fetch_array($extract))
    {
        $i++;
        $list[$i]=$row["id"].','.$row["name"].','.$row["emp"].','.$row["salary"];
    }
$today_doc=date("Y-m-d").".csv";
$today_doc="contacts.csv";
$file = fopen($today_doc,"w");
foreach ($list as $line)
  {
  fputcsv($file,explode(',',$line));
  }
  fclose($file);
  //  We'll be outputting a csv
 header('Content-type: text/csv');
// It will be called contacts.csv
header('Content-Disposition: attachment; filename=contacts.csv');
//The PDF source is in original.csv
readfile("contacts.csv");
}

谁能帮忙解决这个问题。

【问题讨论】:

  • 尝试添加error_reporting(E_ALL);到文件顶部,如果您收到任何通知、警告,那就是原因。
  • 现在错误未显示,但文件正在下载代码。不是保存在文件中的数据。
  • &lt;?php之后添加error_reporting(E_ALL);而不是之前。
  • 它已经在 php 标签中了
  • 您必须检查您的完整文件。在这段代码中,我看不到任何错误。 @kpatil

标签: php csv file-handling


【解决方案1】:

将标头函数放在任何回显/输出之前:

<?php
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename=contacts.csv');

已编辑:

哦,这不是你的问题,但如果你想要这样,你应该回显这个标题 "header('Content-type: text/csv');header('Content-Disposition: attachment; filename=contacts.csv ');"然后从某个变量中的文件加载csv,例如。 "$csv",然后只是回显内容,例如:

<?php
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename=contacts.csv');
$csv = file_get_contents('YOUR  PATH');
echo $csv;
exit;

【讨论】:

  • 现在错误未显示,但文件正在下载代码。不是保存在文件中的数据。
  • 一旦第二个标题执行,下载弹出窗口就会出现。所以不使用 file_get_contents
【解决方案2】:

时,您将始终收到此错误“警告:无法修改标头信息 - 标头已发送”
  1. 你在

  2. 之前留了一个空行
  3. 如果调用是 ajax 调用并且您在调用标头之前回显了一些字符。

只要确保之前没有字符

【讨论】:

    【解决方案3】:

    您可以添加:

    ob_start() 开始时

    ob_flush() 结尾

    例子:

    <?php ob_start(); ?>
    <?php
        header('Content-Type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename=export.csv');
         .......
         ob_flush();
    ?>
    

    注意

    如果你愿意,你可以使用:

    ob_start("ob_gzhandler")
    

    ob_gzhandler() 旨在用作 ob_start() 的回调函数,以帮助将 gz 编码的数据发送到支持压缩网页的 Web 浏览器。

    你看:

    PHP net ob_start

    PHP net ob_gzhandler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      相关资源
      最近更新 更多