Заголовки загружают фактический контент страницы, а не созданный мной CSV-файл - PullRequest
1 голос
/ 26 января 2012

Моя цель заключается в том, чтобы браузер загрузил 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);

Я следовал инструкциям многих статей / ТАК вопросов, которые я прочитал, и я не вижу, что не так с этим кодом.

Я, конечно, ценю любую помощь, которую я могу получить здесь!

Вот полный код (по запросу):

<?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 Ответ

2 голосов
/ 26 января 2012

Попробуйте этот код:

$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 и т. д., в которые этот код включен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...