2012-03-08 108 views
0

当然经过几个小时的思考这个问题,我的问题的第一个评论让我立即解决它。PHP fopen包含不需要的内容

问题是,尽管我在页面顶部的自己的函数中包含了这段代码,但我只是在$ _POST数组中设置了某个标志时才调用它。我直到PHP文件结束时才检查标志。我在该功能之前移动了该检查,并且它工作正常。

原来的问题是如下:


我试图使用则fopen()函数在PHP输出CSV文件,虽然它包含了我想要的数据,它也包含了整个在我真正想要输出的内容之前,页面的HTML结构以及内联样式表。我使用此代码(从here)几乎没有改变。我很熟悉PHP流和输出,所以我从我的希望是一个坚实的基础开始:

$fileName = 'somefile.csv'; 

header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header('Content-Description: File Transfer'); 
header("Content-type: text/csv"); 
header("Content-Disposition: attachment; filename={$fileName}"); 
header("Expires: 0"); 
header("Pragma: public"); 

$fh = @fopen('php://output', 'w'); 

global $wpdb; 
$query = "SELECT * FROM `{$wpdb->prefix}my_table`"; 
$results = $wpdb->get_results($query, ARRAY_A); 

$headerDisplayed = false; 

foreach ($results as $data) { 
    // Add a header row if it hasn't been added yet 
    if (!$headerDisplayed) { 
     // Use the keys from $data as the titles 
     fputcsv($fh, array_keys($data)); 
     $headerDisplayed = true; 
    } 

    // Put the data into the stream 
    fputcsv($fh, $data); 
} 
// Close the file 
fclose($fh); 
// Make sure nothing else is sent, our file is done 
exit; 

我的假设是,这个例子的目的是要被包含在其自己的外部PHP文件,但由于对于我正在处理的约束,我试图将其包含在内联中。我用输出缓冲了一下,但没有获得积极的结果,但是这些PHP文档相当稀少,所以可能会丢失一些东西。

+0

内联如何?你能告诉我们这个代码是如何包含在你的其他代码中的吗? – webbiedave 2012-03-08 17:35:47

+0

相信与否,你的问题实际上解决了这个问题:) 问题是,尽管我在页面的顶部包含了它自己的函数中的这段代码,但我只是在设置了某个标志$ _POST数组。我直到PHP文件结束时才检查标志。我在该功能之前移动了该检查,并且它工作正常。 非常感谢! – Peter 2012-03-08 17:44:09

回答

0

当然,经过几个小时的思考这个问题,我的问题的第一个评论让我立即解决它。

问题是,尽管我在页面顶部的自己的函数中包含了这段代码,但我只是在$ _POST数组中设置了某个标志时才调用它。我直到PHP文件结束时才检查标志。我在该功能之前移动了该检查,并且它工作正常。

0

问题似乎是,同时您尝试从相同的PHP文件,CSV文件和一些html内容输出。你必须将它们分开,以拥有2个不同的URL。

我猜你的PHP代码被你正在讨论的html代码(和css内联)所包围。

你有什么做的是:

  • 有一个PHP脚本,只输出CSV内容(仅包含您向我们展示代码,当然是有开幕PHP标签)

  • 有另一个生成html代码的PHP脚本,并提供了一个链接到前面的脚本(例如)。

+0

我试图避免这样做,因为我在一个平台上工作,使得使用多个脚本非常困难。谢天谢地,我想出了一种方法可以在一个文件中完成这一切。如果你有兴趣,我编辑了我的问题来解释我做了什么。 – Peter 2012-03-08 17:52:05

0

您在“包含内联”原因的正确轨道上,为什么您要在数据前获取所有其他信息。

这个脚本需要是它自己的直接调用的单独文件,而不是将它内联地包含在另一个脚本中。我知道你有其他的数据库连接,并且必须先设置。您必须从标准页面中提取这些页面,并将其包含在此页面上。