1

What I want to do is, calling a class for exporting mysql data to the excel from another class. Below is the code I've used (I've omitted the code for opening the connection):

//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;
    }
}

But it returns error:

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

When I run the code directly without any class and function, it works. I've tried to check the header list using var_dump(headers_list()) and I've got:

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" 
}

I've tried to remove the header using header_remove(); but it was the same. How to solve the problem? Thanks...

mrjimoy_05
  • 3,452
  • 9
  • 58
  • 95

3 Answers3

2

This means that at some point you are sending text to the browser before you do your various header() calls.

Check your code and see if any of it is printing a response to what it is doing. This can be anything from an error from the code or a print of some sort.

Unfortunately without having the complete code we won't be able to identify the specific portion of the code that is sending text to the browser prior to your header() calls.

EDIT:

Also check for white spaces. If you have white spaces outside of the <?php ?> being passed to the browser before the the header() calls, that will do this as well.

Drahkar
  • 1,694
  • 13
  • 17
1

try to add ob_start() at start and ob_flush() at end

Pragnesh Chauhan
  • 8,363
  • 9
  • 42
  • 53
1

This problem occurs when we send some output to browser and than header.You should find out a white space or a echo before any header() like header("location").

refer to this article Header already send problem

Community
  • 1
  • 1
StaticVariable
  • 5,253
  • 4
  • 23
  • 45