标题下载实际的页面内容,而不是我构建的csv文件

时间:2012-01-26 14:26:03

标签: php csv header

我的目标是让浏览器使用标题下载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>

1 个答案:

答案 0 :(得分:2)

试试这段代码:

$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来输出数据,以防止在输出此代码后任何更多的代码被执行任何阻止和HTML。

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