![](/img/trans.png)
[英]MySQL php query printing to screen instead of creating a force download csv file
[英]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.