1

私がやりたいのは、mysqlデータを別のクラスからExcelにエクスポートするためのクラスを呼び出すことです。以下は私が使用したコードです(接続を開くためのコードを省略しました):

//This is the class for calling the `ExportToExcel` class
Class SampleClass {
    public static function mainFunction() {
        ExportToExcel::exportToExcel();
    }
}

Class ExportToExcel {
    public static function exportToExcel() {
        $DB = DB::Open(); //Open the database

       $csv_terminated = "\n";
       $csv_separator = ",";
       $csv_enclosed = '"';
       $csv_escaped = "\\";

       $sql_query = "The Query goes here...";

       $result = $DB->qry($sql_query, 2, TRUE); //Run the query 
       $fields_cnt = 0;
       $schema_insert = '';

       while ($finfo = mysqli_fetch_field($result)) {
           $fields_cnt++;
           $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, stripslashes($finfo->name)) . $csv_enclosed;
           $schema_insert .= $l;
           $schema_insert .= $csv_separator;
       }

       $out = trim(substr($schema_insert, 0, -1));
       $out .= $csv_terminated;

       while ($row = mysqli_fetch_array($result)) {
           $schema_insert = '';
           for ($j = 0; $j < $fields_cnt; $j++) {
               if ($row[$j] == '0' || $row[$j] != '') {
                   if ($csv_enclosed == '') $schema_insert .= $row[$j];
                   else {
                       $schema_insert .= $csv_enclosed . 
                       str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $row[$j]) . $csv_enclosed;
                   }
               } else $schema_insert .= '';

               if ($j < $fields_cnt - 1) $schema_insert .= $csv_separator;
            }

            $out .= $schema_insert;
            $out .= $csv_terminated;
       } 

       header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); //--> WARNING
       header("Content-Length: " . strlen($out)); //--> WARNING
       header("Content-type: text/x-csv"); //--> WARNING
       header("Content-Disposition: attachment; filename=somefile.csv"); //--> WARNING
       echo $out;
       exit;
    }
}

ただし、エラーが返されます。

Warning: Cannot modify header information - headers already sent by (output started at 'files' on line XX

クラスや関数を使用せずにコードを直接実行すると、機能します。を使用してヘッダーリストを確認しようとしvar_dump(headers_list())ましたが、次のようになりました。

array(5) { 
    [0]=> string(23) "X-Powered-By: PHP/5.4.4" 
    [1]=> string(38) "Expires: Thu, 19 Nov 1981 08:52:00 GMT" 
    [2]=> string(77) "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" 
    [3]=> string(16) "Pragma: no-cache" 
    [4]=> string(23) "Content-type: text/html" 
}

を使用してヘッダーを削除しようとしましheader_remove();たが、同じでした。問題を解決する方法は?ありがとう...

4

3 に答える 3

2

これは、さまざまなheader()呼び出しを行う前に、ある時点でブラウザにテキストを送信していることを意味します。

コードをチェックして、コードが実行していることに対する応答を出力しているかどうかを確認します。これは、コードからのエラーまたはある種の印刷からのものである可能性があります。

残念ながら、完全なコードがないと、header()を呼び出す前に、ブラウザにテキストを送信しているコードの特定の部分を特定できません。

編集:

また、空白を確認してください。header()が呼び出される前にブラウザに渡される以外に空白がある場合は<?php ?>、これも同様に行われます。

于 2012-10-03T07:18:14.817 に答える
1

ob_start()最初とob_flush()最後に追加してみてください

于 2012-10-03T07:15:09.927 に答える
1

echoこの問題は、ヘッダーよりもブラウザに出力を送信するときに発生します。空白などの前に空白を見つける必要がありheader()ますheader("location")

この記事を参照してくださいヘッダーはすでに問題を送信しています

于 2012-10-03T07:38:07.520 に答える