我看到很多关于导出到CSV的正确方法的帖子,大多数开发者建议使用fputcsv()
如何将以下脚本转换为使用fputcsv
?
你会看到我也导出了Header行,它反映了表的列名,我想保留它。
<?php
$sql = "SELECT * FROM `tbl_customers`";
$result = mysql_query($sql, $dbdata_conn) or die(mysql_error());
$header = $csv_output = '';
$fields = mysql_num_fields($result);
for ($i = 0; $i < $fields; $i++) {
$header .= mysql_field_name($result, $i) . ",";
}
$header .= "\n";
while ($rowr = mysql_fetch_row($result)) {
for ($j=0; $j<$i; $j++) {
$csv_output .= $rowr[$j].", ";
}
$csv_output .= "\n";
}
$csv_output = $header.$csv_output;
header("Content-type: text/x-csv");
header("Content-Disposition: attachment; filename=test.csv");
header("Pragma: no-cache");
header("Expires: 0");
print "$csv_output";
exit;
?>
我知道mysql_query
已被弃用,所以这是为了练习。
作为旁注,我不熟悉fputcsv
,但我读到它对于格式化csv输出的数据非常有用,节省了所有转义等时间。
(我也非常愿意改进上面的内容)
答案 0 :(得分:1)
简单演示(遵循mysql_*
功能):
$header=array();
$fields = mysql_num_fields($result);
for ($i = 0; $i < $fields; $i++) {
$header[] = mysql_field_name($result, $i);
}
header("...");
$f=fopen("php://output","wt");
fputcsv($f,$header);
while ($row = mysql_fetch_row($result)) {
fputcsv($f,$row);
}
fclose($f);
如您所述,mysql_*
函数已被弃用,因此您也应该这样做。
答案 1 :(得分:0)
如果您想将其作为附件下载,可以不使用fputcsv(),但如果您想使用它,可以采用以下解决方法:
$sql = "SELECT * FROM `tbl_customers`";
$result = mysql_query($sql, $dbdata_conn) or die(mysql_error());
$header = array();
$csv_output = array();
$fields = mysql_num_fields($result);
for ($i = 0; $i < $fields; $i++) {
$header[] = mysql_field_name($result, $i);
}
$csv_output[] = $header;
while ($rowr = mysql_fetch_array($result)) {
$csv_output[] = $rowr;
}
$fp = fopen('/path/to/file.csv', 'w');
foreach ($csv_output as $line) {
fputcsv($fp, $line);
}
fclose($fp);
// if you pick up the file from the directory manually, the following is not needed
header("Content-type: text/x-csv");
header("Content-Disposition: attachment; filename=test.csv");
header("Pragma: no-cache");
header("Expires: 0");
print file_get_contents('/path/to/file.csv');
unlink('/path/to/file.csv');
exit;