我想要做的是,调用一个类将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();
删除标题,但它是相同的。如何解决问题?感谢...
答案 0 :(得分:2)
这意味着在您进行各种header()调用之前,您将在某些时候向浏览器发送文本。
检查您的代码,看看是否有任何代码正在打印对其正在执行的操作的响应。这可以是来自代码中的错误或某种打印的任何内容。
不幸的是,如果没有完整的代码,我们将无法识别在header()调用之前将文本发送到浏览器的代码的特定部分。
修改强>
同时检查空格。如果在header()调用之前将<?php ?>
之外的空格传递给浏览器,那么也会这样做。
答案 1 :(得分:1)
尝试在开始时添加ob_start()
,在结束时添加ob_flush()
答案 2 :(得分:1)
当我们向浏览器发送一些输出而不是标题时会出现此问题。您应该在任何echo
header()
之前找到空格或header("location")
。