标题下载实际页面内容,而不是csv文件I';ve构造


Headers downloading actual page content, not the csv file I've constructed

我的目标是让浏览器使用标头下载csv文件。由于某些尚未确定的原因,浏览器似乎正在下载当前页面的HTML内容(而不是我给它的数组的内容)。

这是我一直在使用的代码:

$arr1 = array(array("1","2","3","4"),array("2","1","6","6"));
$tmp_handle = fopen('php://memory', 'r+');
fputcsv($tmp_handle, $arr1);
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
rewind($tmp_handle);
echo stream_get_contents($tmp_handle);

我已经遵循了我读过的许多文章/SO问题的说明,我看不出这个代码有什么问题。

我当然很感激在这里能得到的任何帮助!

以下是完整的代码(根据要求):

<?php
global $wpdb;
// Get total number of active referrers
$referrer_check = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."referrer");
$num_of_referrers = 0;
foreach ( $referrer_check as $check) 
{
$num_of_referrers++;
}
// Get total number of referral transactions
$num_of_referrals = 0;
$num_referral_check = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."referrer_transactions");
foreach ( $num_referral_check as $check) 
{
$num_of_referrals++;
}
// Check for the top referrer
$top_referrer = $wpdb->get_row("SELECT referrer_id, count(*) as row_count FROM ".$wpdb->prefix."referrer_transactions GROUP BY referrer_id ORDER BY COUNT(*) DESC");
$top_referrer_result = $wpdb->get_row("SELECT * FROM ".$wpdb->prefix."referrer WHERE referrer_id = $top_referrer->referrer_id");
// Construct the table
// Create array for second table
$ref_transactions_table_arr = array(
array("Referee Name", "Referee ID", "Referee Sign Up", "Referee Email","Referrer ID","Referrer Name"));
foreach ($num_referral_check as $check) 
{
$ref_transactions_table_arr[] = array(
$wpdb->get_var("SELECT billing_name FROM ".$wpdb->prefix."pmpro_membership_orders WHERE user_id = $check->buyer_id"),
$check->buyer_id,
$wpdb->get_var("SELECT user_registered FROM ".$wpdb->prefix."users WHERE ID = $check->buyer_id"),
$wpdb->get_var("SELECT user_email FROM ".$wpdb->prefix."users WHERE ID = $check->buyer_id"),
$wpdb->get_var("SELECT referrer_id FROM ".$wpdb->prefix."referrer WHERE referrer_id = $check->referrer_id"),
$wpdb->get_var("SELECT referrer_name FROM ".$wpdb->prefix."referrer WHERE referrer_id = $check->referrer_id")
);
}
// Create array for first table
$active_ref_table_arr = array(
array('Referrer Name', 'Referrer ID', '# of Referrals', 'Address','Referrer Email','Lifetime Referrals'));
foreach ( $referrer_check as $check) 
{
$active_ref_table_arr[] = array(
$check->referrer_name, 
$check->referrer_id,
$wpdb->get_var("SELECT count(*) FROM ".$wpdb->prefix."referrer_transactions WHERE referrer_id = $check->referrer_id"),
$check->referrer_street . " " . $check->referrer_city . ", " . $check->referrer_state . " " . $check->referrer_zip,
$wpdb->get_var("SELECT user_email FROM ".$wpdb->prefix."users WHERE ID= $check->referrer_id"),
$wpdb->get_var("SELECT count(*) FROM ".$wpdb->prefix."referrer_transactions WHERE referrer_id = $check->referrer_id")
);
}
// Download file
if(isset($_POST['export_tbl_one']))
{
$csvData = array(
  array("1","2","3","4"),
  array("2","1","6","6")
);
$fp = fopen('php://memory', 'w+');
/*foreach ($csvData as $row) {
  fputcsv($fp, $row);
}*/
fputcsv($fp,$csvData);
rewind($fp);
$csvFile = stream_get_contents($fp);
fclose($fp);
header('Content-Type: text/csv');
header('Content-Length: '.strlen($csvFile));
header('Content-Disposition: attachment; filename="file.csv"');
exit($csvFile);
}
?>
<div class="nav">
        <ul>
                <li class="first"><a href="#">Total Referrers: <? echo $num_of_referrers;  ?></a></li>
                <li><a href="#">Total Referals: <? echo $num_of_referrals; ?></a></li>
                <li><a href="#">Top Referrer: <? echo $top_referrer->referrer_id . ", " . $top_referrer_result->referrer_name . "(" . $top_referrer->row_count . ")"; ?></a></li>
<li>
<form method="POST" action="http://keepmecertified.com/acp">
<input type="submit" value="click me" name="export_tbl_one"/>
</form>
</li>
        </ul>
</div>
<br>
<table class="table">
<caption>Referrer Transactions</caption>
<?
$num = 0;
foreach($ref_transactions_table_arr as $fields)
{
  echo "<tr>";

    foreach($fields as $data)
    {
      if($num == 0)
      {
        echo "<th class='"ref_head'">$data</th>";
      }
      else
      {
        echo "<td>$data</td>";
      }
    }

   echo "</tr>";
   if($num == 0)
   {
     $num++;
   }

}
?>
</table>
<table class="table">
<caption>Active Referrers</caption>
<?
$num = 0;
foreach($active_ref_table_arr as $fields)
{
  echo "<tr>";

    foreach($fields as $data)
    {
      if($num == 0)
      {
        echo "<th class='"ref_head'">$data</th>";
      }
      else
      {
        echo "<td>$data</td>";
      }
    }

   echo "</tr>";
   if($num == 0)
   {
     $num++;
   }

}
?>
</table>

试试这个代码:

$csvData = array(
  array("1","2","3","4"),
  array("2","1","6","6")
);
$fp = fopen('php://memory', 'w+');
foreach ($csvData as $row) {
  fputcsv($fp, $row);
}
rewind($fp);
$csvFile = stream_get_contents($fp);
fclose($fp);
header('Content-Type: text/csv');
header('Content-Length: '.strlen($csvFile));
header('Content-Disposition: attachment; filename="file.csv"');
exit($csvFile);

我已经循环数据来构建CSV,因为您的代码不会产生您期望的结果。在输出之前,我还将文件检索为字符串——这只是添加Content-Length标头的一个细节。我还有一个重要的比特,叫做exit,用来输出数据,防止更多的代码被执行。

如果您正在使用此代码,但仍然有问题,则该代码没有被调用-您应该检查此代码所包含的任何if语句等。

这太晚了,但我们希望这能解锁某人。

使用ob_end_clean()清除页面上的其他缓冲区。

ob_end_clean();开始,以exit; 结束

这样,只有介于两者之间的输出才会写入文件。