array - php read excel
No se puede modificar la información del encabezado en la función estática (3)
Esta pregunta ya tiene una respuesta aquí:
- Cómo reparar el error "Encabezados ya enviados" en PHP 11 respuestas
Lo que quiero hacer es llamar a una clase para exportar datos de MySQL al Excel desde otra clase. Debajo está el código que he usado (he omitido el código para abrir la conexión):
//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;
}
}
Pero devuelve error:
Warning: Cannot modify header information - headers already sent by (output started at ''files'' on line XX
Cuando ejecuto el código directamente sin ninguna clase y función, funciona. Intenté verificar la lista de encabezado usando var_dump(headers_list())
y obtuve:
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"
}
Intenté eliminar el encabezado usando header_remove();
pero fue lo mismo. ¿Como resolver el problema? Gracias...
Esto significa que en algún momento está enviando texto al navegador antes de hacer sus varias llamadas de encabezado ().
Verifique su código y vea si alguno de ellos está imprimiendo una respuesta a lo que está haciendo. Esto puede ser cualquier cosa, desde un error del código o una impresión de algún tipo.
Desafortunadamente, sin tener el código completo, no podremos identificar la parte específica del código que envía texto al navegador antes de las llamadas a su encabezado ().
EDITAR:
También verifique si hay espacios en blanco. Si tiene espacios en blanco fuera del <?php ?>
Que se pasan al navegador antes de que el encabezado () llame, eso también lo hará.
intente agregar ob_start()
al inicio y ob_flush()
al final
Este problema se produce cuando enviamos algunos resultados al navegador y luego al encabezado. Debe encontrar un espacio en blanco o un echo
antes de cualquier header()
como el header("location")
.
consulte este artículo El encabezado ya envía el problema