2011-06-09 87 views
3

上午嘗試將數據從mysql導出到csv文件。我把下面的腳本,但$ result變量中有錯誤:mysql_num_fields告訴提供的參數無效我怎樣才能將mysql表導出到csv文件並下載它

$filename = 'myfile.csv'; 
$result = db_query("SELECT * FROM {loreal_salons}"); 


drupal_set_header('Content-Type: text/csv'); 
drupal_set_header('Content-Disposition: attachment; filename=' . $filename); 

$count = mysql_num_fields($result); 
for ($i = 0; $i < $count; $i++) { 
    $header[] = mysql_field_name($result, $i); 
} 
print implode(',', $header) . "\r\n"; 

while ($row = db_fetch_array($result)) { 
    foreach ($row as $value) { 
     $values[] = '"' . str_replace('"', '""', decode_entities(strip_tags($value))) . '"'; 
    } 
    print implode(',', $values) . "\r\n"; 
    unset($values); 
} 
+0

那些大括號是什麼? – 2011-06-09 14:35:14

+0

這是Drupal。沒問題。 – Mamadou 2011-06-09 14:38:12

+0

我猜想括號仍然導致問題。你對這張桌子有其他疑問嗎?他們執行正確嗎?如果不嘗試反向引用表名,像這樣:'\'{lreal_salons} \'' – ben 2011-06-09 15:16:06

回答

4

如果你不介意使用一個臨時文件,你可以這樣做:

SELECT * 
INTO OUTFILE '/tmp/myfile.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
FROM loreal_salons 

作爲您的查詢,那麼只需做:

header('Content-type: text/csv'); 
header('Content-disposition: attachment; filename=myfile.csv'); 
readfile('/tmp/myfile.csv'); 
unlink('/tmp/myfile.csv'); 
exit(); 
+1

文件/文件夾權限會有問題嗎? mysqld可以在httpd擁有的文件/文件夾中寫入嗎? – 2011-06-09 14:58:41

+0

MySQL只會寫出它有寫權限的地方,並且不會覆蓋現有文件(以防止注入攻擊能夠覆蓋其他文件)。您可以設置一個專用目錄,並將httpd和mysql放入具有該目錄寫入權限的組中。 – 2011-06-09 15:25:18