2011-01-05 114 views
0

我在導出使用php從我的一個mysql表創建的csv文件時遇到了一些麻煩。從Mysql導出CSV

我正在使用的代碼會打印正確的數據,但我看不到如何在csv文件中下載此數據,並提供下載鏈接到創建的文件。我以爲瀏覽器應該自動提供下載文件,但它不會。 (難道是因爲下面的代碼使用AJAX叫什麼名字?)

任何幫助,不勝感激 - 下面的代碼,S.

include('../cofig/config.php'); //db connection settings 
$query = "SELECT * FROM isregistered"; 
$export = mysql_query($query) or die("Sql error : " . mysql_error()); 
$fields = mysql_num_fields($export); 
for ($i = 0; $i < $fields; $i++) { 
    $header .= mysql_field_name($export, $i) . "\t"; 
} 
while ($row = mysql_fetch_row($export)) { 
    $line = ''; 
    foreach ($row as $value) { 
     if ((!isset($value)) || ($value == "")) { 
      $value = "\t"; 
     } else { 
      $value = str_replace('"', '""', $value); 
      $value = '"' . $value . '"' . "\t"; 
     } 
     $line .= $value; 
    } 
    $data .= trim($line) . "\n"; 
} 
$data = str_replace("\r", "", $data); 

if ($data == "") { 
    $data = "\n(0) Records Found!\n"; 
} 
//header("Content-type: application/octet-stream"); //have tried all of these at sometime 
//header("Content-type: text/x-csv"); 
header("Content-type: text/csv"); 
//header("Content-type: application/csv"); 
header("Content-Disposition: attachment; filename=export.csv"); 
//header("Content-Disposition: attachment; filename=export.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

echo '<a href="">Download Exported Data</a>'; //want my link to go in here... 

print "$header\n$data"; 

回答

0

你不能有文本和在同一頁面上下載。你需要有一個到下載區域的鏈接,這個鏈接可能只是一個GET參數,通過它可以完成所有的處理,顯示標題並回顯CSV的內容。

例如,您可以有<a href="foo.php?action=download">Click here to download CSV</a>,然後在您的代碼中有if ($_GET['action'] === 'download'),從數據庫中獲取數據,格式化它,發送標題並回顯數據。然後die(),因爲腳本的那部分不能完成。

+0

非常感謝大家的幫助 - 非常感謝。 – ss888 2011-01-06 10:49:19

0

你不應該把鏈接在生成CSV相同的文件,因爲鏈接不會在csv本身!

做這樣的事情:

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

,它應該工作

+0

然後用正確的內容類型:application/vnd.ms-Excel的使用.xls文件。 – 2011-01-05 17:52:44

+0

@Andrew Sledge:你爲什麼要使用這種內容類型?如果我沒有安裝Office,會發生什麼情況? 'text/csv'是他應該使用的。 – nico 2011-01-05 17:54:39

+0

我認爲Andrew Sledge說過,對於有關xls文件的註釋行,請使用正確的類型。 – Andrew 2011-01-06 14:03:12

1

實質上,您無法一次輸出CSV文件及其鏈接。 (您需要引入頁面「模式」的概念,並通過... pagename.php?mode = download或類似方式激活下載模式。然後您可以使用PHP的switch語句來切換$ _GET ['mode'] )

也就是說,您使用的text/csv內容類型標題是正確的,不過您可能還想輸出Content-Length和Content-Disposition標題。在輸出文件數據之後,還要確保通過PHP的exit函數停止任何其他腳本處理。

此外,如果使用MySQL SELECT ... INTO OUTFILE工具(如果您擁有權限)而不是使用PHP收集數據,它可能會少很多麻煩(並且一定會更快/更高效地存儲內存)。

0

三件事情要考慮:

  1. 你發送消息頭指示用戶將要下載一個CSV文件,但你送創建一個鏈接,下載呢?這是不正確的,你應該鏈接到這個頁面,然後只在標題後輸出CSV數據本身。

  2. MySQL有能力生成CSV輸出,你應該一定要利用這一點,而不是嘗試自己做。你可以使用SELECT INTO ... OUTFILE來做到這一點。

  3. 如果您必須使用PHP創建CSV,請使用fputcsv來完成此操作。這將處理CSV的所有複雜情況,例如轉義和正確格式。由於fputcsv寫入一個文件,你既可以把它寫入一個臨時文件,然後之後你輸出它把你的頭,或者使用下面的技巧,直接將它輸出:

發送標題之後:

$fp = fopen('php://output', 'w'); 
while($row = mysql_fetch_row($export)) { 
    fputcsv($fp, $row); 
} 
0

我認爲mySQL => CSV是每個PHP論壇的一部分的常見問題。 我試圖用一種常見的方式解決這個問題,併爲PHP實現了一個免費的導出 lib,它非常類似於Google AppInventor哲學。 DragDrop並隱藏編碼的東西。

使用該庫並通過點擊創建您的導出& Point。

共同演示:http://www.freegroup.de/software/phpBlocks/demo.html 鏈接編輯:http://www.freegroup.de/test/editor/editor.php?xml=demo_sql.xml

值得一看

問候

安德烈亞斯