簡體   English   中英

關於警告的奇怪錯誤:無法修改標題信息-沒有空格PHP時已經發送的標題

[英]Strange error regarding Warning: Cannot modify header information - headers already sent by when there is no white space PHP

我正在嘗試使用Header函數下載CSV文件,但是由於某些原因,它沒有在瀏覽器中下載。

錯誤是:

Warning: Cannot modify header information - headers already sent by (output started at /xxx/fruitapp/report-admin/common/header.php:156) in /xxx/fruitapp/report-admin/pages/createCSVdamage.php on line 434

我的header.php file line 156錯誤指的是有錯誤,如下所示:

<div class="container-fluid">
<div class="row-fluid">
<?php if($title[0] != 'reports' && $title[0] != 'damage_reports' && $title[0] != 'Byconsignee_reports' && $title[0] != 'Byhold_reports' && $title[0] != 'general_reports'){?>
<div class="span3" id="sidebar">
  <ul class="nav nav-list bs-docs-sidenav nav-collapse collapse">
    <?php if($title[0]=='dashboard'){?>
    <li class="active"><a href="index.php?select=dashboard"><i class="icon-chevron-right"></i>Dashboard</a></li>
    <?php }if($title[0]=='report_entry' || $title[0]=='add_report_entry' || $title[0]=='edit_report_entry'){?>
    <li><a href="index.php?select=report_entry"><i class="icon-chevron-right"></i>Manage Report Entry</a></li>
    <li><a href="index.php?select=add_report_entry"><i class="icon-chevron-right"></i>Add Report Entry</a></li>
    <?php }if($title[0]=='damage_entry' || $title[0]=='add_damage_entry' || $title[0]=='edit_damage_entry'){?>
    <li><a href="index.php?select=damage_entry"><i class="icon-chevron-right"></i>Manage Damage Entry</a></li>
    <li><a href="index.php?select=add_damage_entry"><i class="icon-chevron-right"></i>Add Damage Entry</a></li>
    <?php }if($title[0]=='edit'){?>
    <li><a href="index.php?select=edit"><i class="icon-chevron-right"></i>Manage Edit</a></li>
    <?php }if($title[0]=='search'){?>
    <li><a href="index.php?select=search"><i class="icon-chevron-right"></i>Manage Search</a></li>
    <?php }if($title[0]=='users' || $title[0]=='add_user' || $title[0]=='edit_user'){?>
    <li><a href="index.php?select=users"><i class="icon-chevron-right"></i>Manage User</a></li>
    <li><a href="index.php?select=add_user"><i class="icon-chevron-right"></i>Add Users</a></li>
    <?php }?>
  </ul>
</div>
<?php }?>

顯然,其中沒有空格,甚至我也嘗試過使用BOM,但沒有任何效果。

此外,如果我添加ob_start(); 僅當ftp上的文件已包含數據時,才導出空文件。

我文件末尾的代碼是-我正在使用此代碼在瀏覽器中下載它。

if ((isset($_REQUEST['date_from']) && $_REQUEST['date_from'] != "") || (isset($_REQUEST['date_to']) && $_REQUEST['date_to'] != "")) {
    fputcsv($file, array(
        'Report Number',
        'Consignee',
        'Pallet ID',
        'Label/Mark',
        'Fruit/Variety',
        'Deck',
        'Type',
        'Damage Description',
        'Pieces Damage',
        'Category'
    ));
    $sql = mysql_query("SELECT * FROM damage") or die('Error In Query');
    while ($rows = mysql_fetch_object($sql)) {
        $sqaal = mysql_query("SELECT
                                                    damage_entry.report_ID,
                                                    damage_entry.consignee,
                                                    damage_entry.pallet_ID,
                                                    damage_entry.label,
                                                    damage_entry.variety,
                                                    CONCAT(damage_entry.hold,damage_entry.deck),
                                                    damage_entry.type,
                                                    damage_entry.damage_desc,
                                                    damage_entry.pieces,
                                                    damage_entry.category_code
                                                FROM
                                                    damage_entry
                                                WHERE
                                                    damage='" . $rows->damage_name . "'  " . $cond . "") or die(mysqli_error(self::get_Conn()));
        $a = mysql_num_rows($sqaal);
        if ($a > 0) {
            fwrite($file, $rows->damage_name);
            fwrite($file, "\r\n");
            $valuesArray = array();
            $as          = 0;
            $sd          = array();
            $gggg        = array();
            while ($row = mysql_fetch_assoc($sqaal)) {
                $array = array(
                    $row['report_ID'],
                    $row['consignee'],
                    $row['pallet_ID'],
                    $row['label'],
                    $row['variety'],
                    $row['CONCAT(damage_entry.hold,damage_entry.deck)'],
                    $row['type'],
                    $row['damage_desc'],
                    $row['pieces'],
                    //$objadminViewFunctions->getCategoryLetter($row['category_code'])
                );
                array_push($sd, $row['pieces']);
                array_push($gggg, $row['pallet_ID']);
                fputcsv($file, $array);
            }
            fwrite($file, "\r\n");
            fputcsv($file, array(
                "",
                "Sub Total",
                count($gggg),
                "",
                "",
                "",
                "",
                "",
                array_sum($sd),
                "",
                ""
            ));
            fwrite($file, "\r\n");
        }
    }
} else {
    fputcsv($file, array(
            'Report Number',
            'Consignee',
            'Pallet ID',
            'Label/Mark',
            'Fruit/Variety',
            'Deck',
            'Type',
            'Damage Description',
            'Pieces Damage',
            'Category'
        ));
    $sql = mysql_query("SELECT * FROM damage") or die('Error In Query');
    while ($rows = mysql_fetch_object($sql)) {
        $sqaal = mysql_query("SELECT
                                                    damage_entry.de_ID,
                                                    damage_entry.report_ID,
                                                    damage_entry.consignee,
                                                    damage_entry.pallet_ID,
                                                    damage_entry.label,
                                                    damage_entry.variety,
                                                    CONCAT(damage_entry.hold,damage_entry.deck),
                                                    damage_entry.type,
                                                    damage_entry.damage_desc,
                                                    damage_entry.pieces,
                                                    damage_entry.category_code
                                                FROM
                                                    damage_entry
                                                WHERE
                                                    damage='" . $rows->damage_name . "'") or die(mysqli_error(self::get_Conn()));
        $a = mysql_num_rows($sqaal);
        if ($a > 0) {
            fwrite($file, $rows->damage_name);
            fwrite($file, "\r\n");
            $valuesArray = array();
            $as          = 0;
            $sd          = array();
            $gggg        = array();
            while ($row = mysql_fetch_assoc($sqaal)) {
                $array = array(
                    $row['report_ID'],
                    $row['consignee'],
                    $row['pallet_ID'],
                    $row['label'],
                    $row['variety'],
                    $row['CONCAT(damage_entry.hold,damage_entry.deck)'],
                    $row['type'],
                    $row['damage_desc'],
                    $row['pieces'],
                    //$objadminViewFunctions->getCategoryLetter($row['category_code'])
                );
                array_push($sd, $row['pieces']);
                array_push($gggg, $row['pallet_ID']);
                fputcsv($file, $array);
            }
            fwrite($file, "\r\n");
            fputcsv($file, array(
                "",
                "Sub Total",
                count($gggg),
                "",
                "",
                "",
                "",
                "",
                array_sum($sd),
                "",
                ""
            ));
            fwrite($file, "\r\n");
        }
    }
}
fclose($file);
$filename = $FileName;
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
$file_extension = strtolower(substr(strrchr($filename,"."),1));
switch( $file_extension ){
    case "pdf": $ctype="application/pdf"; break;
    case "exe": $ctype="application/octet-stream"; break;
    case "zip": $ctype="application/zip"; break;
    case "doc": $ctype="application/msword"; break;
    case "xls": $ctype="application/vnd.ms-excel"; break;
    case "csv": $ctype="text/csv"; break;
    case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
    case "gif": $ctype="image/gif"; break;
    case "png": $ctype="image/png"; break;
    case "jpeg":
    case "jpg": $ctype="image/jpg"; break;
    default: $ctype="application/force-download";
}
header("Content-Type: application/octet-stream");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));

PS:我還使用了十六進制編輯器來檢查代碼中的BOM,但是所有代碼都是干凈的。 標頭中沒有輸出任何內容,在我的問題中也是如此,因為它與header功能之前的echo語句無關。

我的問題是它沒有在瀏覽器中下載。

您最初的問題是,你以某種方式調用header.php ,其中包含了一些HTML的- 沒有任何形式的輸出可以在標題之前發送給瀏覽器。 解決方案是直接調用createCSVdamage.php

關於空的csv,您實際上從未將csv數據發送到oputput流。 您可以在設置標頭之后通過readfile函數來實現:

header("Content-Type: application/octet-stream");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));

//send the data to the browser
readfile($filename);

要移動文件,可以在發送數據后使用重命名pathinfo函數:

$fileData = pathinfo($filename);
$nameWithoutDirectory = $fileData['basename'];

rename($filename, 'some/directory/' . $nameWithoutDirectory);

或者,也可以首先在正確的目錄中創建文件!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM