0

可能重复:
PHP 已发送的标头

将 mysql 表转换为 .CSV 文件的 PHP 脚本给出了无法修改标头信息和不将数据写入 CSV 文件等错误:

以下是错误:

警告:无法修改标头信息 - 标头已由第 30 行 /home/public_html/amgtst/export-tst.php 中的(输出开始于 /home/public_html/amgtst/export-tst.php:3)发送

警告:无法修改标头信息 - 标头已由第 31 行 /home/public_html/amgtst/export-tst.php 中的(输出开始于 /home/public_html/amgtst/export-tst.php:3)发送

警告:无法修改标头信息 - 标头已由第 32 行 /home/public_html/amgtst/export-tst.php 中的(输出开始于 /home/public_html/amgtst/export-tst.php:3)发送

警告:无法修改标头信息 - 标头已由第 33 行 /home/public_html/amgtst/export-tst.php 中的(输出开始于 /home/public_html/amgtst/export-tst.php:3)发送

Area Area DC_No Area DC_No Product_type Area DC_No Product_type DC_date Area DC_No Product_type DC_date Ac_code Area DC_No Product_type DC_date Ac_code PO_No Area DC_No Product_type DC_date Ac_code PO_No PO_date Area DC_No Product_type DC_date Ac_code PO_No PO_date Inv_No Area DC_No Product_type DC_date Ac_code PO_No PO_date Inv_No CNo_Qty Area DC_No Product_type DC_date Ac_code PO_No PO_date Inv_No CNo_Qty Deleted Area DC_No Product_type DC_date Ac_code PO_No PO_date Inv_No CNo_Qty Deleted Vehicle_no Area DC_No Product_type DC_date Ac_code PO_No PO_date Inv_No CNo_Qty Deleted Vehicle_no "Jayanagar" "100" "Gas" "2012-11-30" "2" "2012-11-30" "11" "KA123-333" "Jayanagar" "104" "Gas" "2012-12-03" "3" "2012-12-03" "14" "Jayanagar" "101" "Gas" "2012-12-03" "3" "2012-12-03" "13" "Jayanagar" "105" "Gas" "2012-12-03" "3" "2012-12-03" "17" "Jayanagar" "106" "Gas" "2012-12-03" "3" "2012-12-03" "16" "Jayanagar" "107" "Gas" "2012-12-03" "3" "2012-12-03" "KA576" "Jayanagar" "108" "Gas" "2012-12-03" "2" "2012-12-03" "25" "KA01P213" "Jayanagar" "111" "Gas" "2012-12-04" "2" "2012-12-04" "27" "Jayanagar" "125" "Gas" "2012-12-04" "3" "2012-12-04" "12" "Jayanagar" "116" "Gas" "2012-12-06" "2" "2012-12-06" "Jayanagar" "117" "Gas" "2012-12-06" "2" "2012-12-06" "19" "Jayanagar" "118" "Gas" "2012-12-06" "2" "2012-12-06" "20" "Jayanagar" "119" "Gas" "2012-12-06" "2" "2012-12-06" "21" "Jayanagar" "130" "Gas" "2012-12-06" "3" "2012-12-06" "22" "KA-01-A4564" "Jayanagar" "131" "Gas" "2012-12-08" "2" "2012-12-08" "23" "KA01-23212" "Jayanagar" "132" "Gas" "2012-12-08" "2" "PIA-234234-ERES" "2012-12-08" "24" "KA-10-23232" "Jayanagar" "133" "Gas" "2012-12-08" "2" "verbal" "2012-12-08" "26" "ka91901212" 

我的php脚本:

    <?php
    include 'dbconnect.php';

    echo "Exporting file - process"."<br><br>";


        header("Content-type: application/csv");
        header("Content-Disposition: attachment; filename=download.csv");
        header("Pragma: no-cache");
        header("Expires: 0");



    $query = "SELECT * FROM DCHDR";

    $export = mysql_query ($query ) or die ( "Sql error : " . mysql_error( ) );

    $fields = mysql_num_fields ( $export );

    for ( $i = 0; $i < $fields; $i++ )
    {
        $header .= mysql_field_name( $export , $i ) . "\t";
        
        echo $header;
    }

    while( $row = mysql_fetch_row( $export ) )
    {
        $line = '';
        foreach( $row as $value )
        {                                            
            if ( ( !isset( $value ) ) || ( $value == "" ) )
            {
                $value = "\t";
            }
            else
            {
                $value = str_replace( '"' , '""' , $value );
                $value = '"' . $value . '"' . "\t";
            }
            $line .= $value;
        }
        $data .= trim( $line ) . "\n";
    }
    $data = str_replace( "\r" , "" , $data );

    if ( $data == "" )
    {
        $data = "\n(0) Records Found!\n";                        
    }

    print "$header\n$data";

    exit();

    php?>
4

5 回答 5

1

在这一行

echo "Exporting file - process"."<br><br>";

你做了一些输出,而几行之后你尝试了几个header()调用。

引用PHP 文档

请记住,必须在发送任何实际输出之前调用 header(),无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 发送。

在创建之前,请执行任何标头调用,将一些输出发送到客户端(使用echo或类似)!

除此之外,您可以使用本机fputcsv()创建 CSV 文件。tmpfile()如果您想将输出发送到客户端,可能与 结合使用。

于 2012-12-12T11:43:34.643 回答
0

使用 ob_start(); 文件顶部的函数并删除所有回声,除了最后一个

于 2012-12-12T11:41:55.153 回答
0

消除

echo "Exporting file - process"."<br><br>";
于 2012-12-12T11:42:18.877 回答
0

编辑:看看这个问题

您需要使用ob_start();然后ob_end_flush(),因为看起来您正在尝试在某些内容已发送到浏览器之后设置标题。

尝试这个:

<?php

ob_start();

include 'dbconnect.php';

echo "Exporting file - process"."<br><br>";


    header("Content-type: application/csv");
    header("Content-Disposition: attachment; filename=download.csv");
    header("Pragma: no-cache");
    header("Expires: 0");



$query = "SELECT * FROM DCHDR";

$export = mysql_query ($query ) or die ( "Sql error : " . mysql_error( ) );

$fields = mysql_num_fields ( $export );

for ( $i = 0; $i < $fields; $i++ )
{
    $header .= mysql_field_name( $export , $i ) . "\t";

    echo $header;
}

while( $row = mysql_fetch_row( $export ) )
{
    $line = '';
    foreach( $row as $value )
    {                                            
        if ( ( !isset( $value ) ) || ( $value == "" ) )
        {
            $value = "\t";
        }
        else
        {
            $value = str_replace( '"' , '""' , $value );
            $value = '"' . $value . '"' . "\t";
        }
        $line .= $value;
    }
    $data .= trim( $line ) . "\n";
}
$data = str_replace( "\r" , "" , $data );

if ( $data == "" )
{
    $data = "\n(0) Records Found!\n";                        
}

print "$header\n$data";

ob_end_flush();

exit();

php?>

您也可能想使用 php 内置的 CSV 函数fputcsv

于 2012-12-12T11:42:58.840 回答
0

您不能在标题信息之前发送任何数据,所以行

echo "Exporting file - process"."<br><br>";

必须删除。

于 2012-12-12T11:43:20.380 回答