PHP fopen包含不需要的内容

时间:2012-03-08 17:33:05

标签: php filestream fopen output-buffering

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

问题在于,虽然我在页面顶部将自己的代码包含在自己的函数中,但只有在$ _POST数组中设置了某个标志时才调用它。直到PHP文件结束,我才检查标志。我在函数之前移动了那个检查,并且它有效。

原始问题如下:


我正在尝试在PHP中使用fopen()函数来输出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文档非常稀疏,所以可能有些东西我不知道。

3 个答案:

答案 0 :(得分:0)

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

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

你要做的是:

  • 有一个只输出CSV内容的PHP脚本(当然只包含你向我们展示的代码,当然还有开放的php标签)

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

答案 1 :(得分:0)

您正在使用“包含内联”的原因,以了解为什么您要在数据之前获取其他所有内容。

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

答案 2 :(得分:0)

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

问题在于,虽然我在页面顶部将自己的代码包含在自己的函数中,但只有在$ _POST数组中设置了某个标志时才调用它。直到PHP文件结束,我才检查标志。我在函数之前移动了那个检查,并且它有效。