当然,经过几个小时的思考这个问题,对我的问题的第一个评论引导我立即解决它。
问题在于,虽然我在页面顶部将自己的代码包含在自己的函数中,但只有在$ _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文档非常稀疏,所以可能有些东西我不知道。
答案 0 :(得分:0)
问题似乎是,同时你尝试从同一个PHP文件输出CSV文件和一些html内容。您必须将它们分开,才能拥有2个不同的网址。
我猜你的PHP代码被你正在讨论的html代码(和css inline)所包围。
你要做的是:
有一个只输出CSV内容的PHP脚本(当然只包含你向我们展示的代码,当然还有开放的php标签)
有另一个PHP脚本生成html代码,并提供前一个脚本的链接(例如)。
答案 1 :(得分:0)
您正在使用“包含内联”的原因,以了解为什么您要在数据之前获取其他所有内容。
此脚本需要是直接调用的独立文件,而不是将其内联在另一个脚本中。我知道你有其他数据库连接,必须先设置。您必须从标准页面中提取这些内容并将其包含在此页面中。
答案 2 :(得分:0)
当然,经过几个小时的思考这个问题,对我的问题的第一个评论引导我立即解决它。
问题在于,虽然我在页面顶部将自己的代码包含在自己的函数中,但只有在$ _POST数组中设置了某个标志时才调用它。直到PHP文件结束,我才检查标志。我在函数之前移动了那个检查,并且它有效。