2011-06-09 86 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