簡體   English   中英

PHP / MYSQL到CSV將代碼打印輸出到屏幕而不是CSV文件

[英]PHP/MYSQL to CSV Export code printing to screen instead of CSV file

我無法讓瀏覽器提示下載。 輸出將改為顯示在屏幕上。 我在此站點上嘗試了許多與此主題相關的其他主題,但均無濟於事。 我可以將fopen("php://output","w")更改為fopen("export.csv","w")但這將在服務器上保存export.csv文件的副本,不想。 我希望將文件下載到客戶端而不將其保存在服務器上。 這是我的代碼:

$sql = mysql_query($_SESSION["export-query"]);
$fields = mysql_num_fields($sql);
$header = array();

for ($i = 0; $i < $fields; $i++) {
    $header[] = mysql_field_name($sql, $i);
}

$f = fopen("php://output","w"); 
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=export.csv');
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate');
fputcsv($f, $header);

while ($row = mysql_fetch_row($sql)) {
    fputcsv($f, $row);
}
fclose($f);

請幫忙! 非常感激。

您的代碼確實很接近我,但是我有這個

header("Content-type: application/vnd.ms-excel");

用於內容類型。 我認為這可行,因為瀏覽器知道如何處理text / csv,但他們不知道如何處理excel。 它將提示下載,因為它本身不會打開此類文件。

我也沒有“必須重新驗證”,但我認為這沒有什么不同。

編輯:

這是我的完整標頭,它們在100%的時間內都有效。 與您之間的差異很小,所以也許其中一個是原因。

    header("Content-type: application/vnd.ms-excel");
    header("Content-disposition: attachment; filename=".$filename.".csv");
    header("Pragma: no-cache");
    header("Expires: 0");

編輯2:

從您對答案的評論來看,您會將所有這些代碼作為ajax調用放入div中。 不起作用的原因是,您只能在頁面的初始調用上設置標題。 在ajax調用上設置標頭將被忽略。

這是我的系統處理csv生成的方式。 因為我需要在不同的csv文件之間可能有所不同的特定信息,所以我將生成器文件的名稱放入表單的“操作”中並提供了一個提交按鈕:

<form action="thegeneratorpage.php" method="get"><fieldset>
     <p>Download [...] in .csv (Excel) form.  You can narrow by [...].</p>
     <!-- code here that allows users to narrow down what is in the csv -->
     <input type="submit" value="Download" />
</fieldset></form>

如果信息不變,則可以執行以下操作:

<a href="thegeneratorpage.php">Download CSV</a>

我們一直在討論的所有代碼都在thegeneratorpage.php

建議不要使用fputcsv函數,而是像這樣回顯CSV文件的行(請注意,我使用的標頭與您的標頭略有不同):

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename={$fileName}");
header("Content-Transfer-Encoding: binary");
while ($row = mysql_fetch_row($sql)) {
    // optionally enclose data if necessary
    foreach ($row as $k => $v) {
        if (strpos($v, ',') !== false) {
            $row[$k] = '"' . $v . '"';
        }
    }
    echo implode(',', array_values($row));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM