将MySQL数据导出为CSV文件时,PHP代码输出的结果包含HTML标记

4

我已经看到了一篇关于这个问题的帖子,但它并没有给出一个解决方案(至少对我来说没有)...

我有一个PHP页面,执行一些基本的MySQL查询,将结果显示在页面上。在这个过程中,我使用了一些$_GET和$_SESSION变量。

在同一个页面中,我还允许用户通过调用函数“导出到CSV”。从导出返回的文件底部包含CSV结果,但也包含我的页面的HTML代码(调用函数)。

现在,在页面顶部我有ob_start(),在页面底部我有ob_flush(),否则在页面加载时我会收到一些“无法修改头部...”错误。因此,如我所阅读的帖子所建议的:

 My guess is that you've got some sort of template that generates the same HTML header and footer regardless of the page that is requested. Sometime before the exportCSV function is called, the header is generated.

 You don't show the bottom of the output, but I'll bet the footer is there too, since I suspect the flow control will continue on to that code after the function exits."

 (http://stackoverflow.com/questions/207019/why-am-i-getting-html-in-my-mysql-export-to-csv/207046)

有人知道如何防止这种情况发生吗?如果需要,我可以发布一些代码...

谢谢!

编辑:

在调用我的导出函数之前调用ob_end_clean()可以清除CSV之前的任何html。然而,我仍然会在CSV结果后面得到一些HTML关闭标签...

 fname  lname   MONTH   WeekdayCount    WeekendCount
 John   Doe 8   1   0
 John   Doe 7   3   2
 Jane   Smith   7   3   2
 </div>             
    </div>          
 </div>             

 </body>                

 </html>            

编辑:

在调用CSV导出脚本后,通过调用exit()函数解决了此问题。

3个回答

8

在输出csv数据之前,您可以尝试调用ob_end_clean()方法来清除已经打印为HTML的任何输出。

在输出csv数据后,您可以调用exit()方法来停止页面余下的内容的输出。

这似乎不是一种特别好的方法,难道您不能有一个单独的PHP脚本来输出csv文件吗?默认情况下不包括头部和页脚?


啊,算了,我在输出csv后忘记调用exit()了。这样可以了!非常感谢。我必须使用ob_flush和ob_end_clean()等函数,这是不好的吗? - littleK
实际导出CSV的脚本是独立的。但我必须在我的现有PHP页面中调用该脚本(其中混合了HTML)... - littleK
你可以考虑将你的PHP脚本分为逻辑和表现两部分,即在加载和处理所有数据,并确定页面上需要什么之前不要输出任何HTML。 - Tom Haigh
在调用CSV导出脚本后,通过调用exit()函数解决了我的问题。 - Kannan Prasad
退出对我有效。这是在我的 Joomla 组件中使用的。谢谢。 - cha

2

没有看到您的脚本,很难确定问题是什么,除了说在发送任何内容后,您不能向客户端发送HTTP头。这包括空白字符。有时,在您的开头<?php语句之前,可能会有不可打印的字符。如果需要,请使用十六进制编辑器查找这些字符。

您的export.php脚本顶部应该类似于:

<?php
header('Content-Type: text/csv');
...

这是事实吗?


不,情况并非如此。但我添加了它,似乎没有任何作用... - littleK

0

我也遇到了这个问题,但已经解决了。 我的代码是:

<html>
<title> </title>
<body>
       <?php
         ....Code which output MySQL to CSV
       ?>
</body></html>

以下是带有HTML代码开头的CSV文件示例。

<html>                      
<head>                  
<meta http-equiv="Content-Language" content="th">                   
<meta http-equiv="content-Type" content="text/html; charset=window-874">                    
<meta http-equiv="content-Type" content="text/html; charset=tis-620">                   

<title> Super Man  </title>                 

</head>                     

<body bgcolor="#FFFFD4">                    

<SQL rows resulted>
xx5497  1/7/2015 1:03   SSFTM   SSFTVM  35  Condition2
xx5498  1/7/2015 1:04   SSDHN   SSDHKN  13  Condition2
xx5499  1/7/2015 1:06   SSFTM   SSFTVM  14  Condition2

运行时,CSV文件在顶部有前12行。这对我来说看起来很疯狂。我通过将PHP代码移到顶部来解决了这个问题。然后结果就没问题了。只有SQL结果被输出到CSV文件中。

<?php
  ....Code which output MySQL to CSV
?>

<html>
<title> </title>
<body>

</body></html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接