我正试图将我的PHP代码输出到一个可下载的CSV文件中,到目前为止我能够做到这一点,但目前输出并没有将字段数据放在单独的列中。相反,它将所有内容放在一列中,除此之外,它还会在相邻列中显示邮政编码。有人知道为什么会这样吗?
<?php
header("Content-type: text/csv");
header("Cache-Control: no-store, no-cache");
header('Content-Disposition: attachment; filename="filename.csv"');
$outstream = fopen("php://output",'w');
if ($db_found) {
// Select all fields from bodyshops_master_network table
$SQL = "SELECT * FROM bodyshops_master_network";
$result = mysql_query($SQL);
while ( $db_field = mysql_fetch_assoc($result) ) {
// Splits the arrays
$row = explode(",", $db_field['postcodes_covered']);
$dealer_code = $db_field['dealer_code'];
$dealer_name = $db_field['dealer_name'];
$bodyshop_id = $db_field['bodyshop_id'];
$bodyshop_name = $db_field['bodyshop_name'];
$address1 = $db_field['address1'];
$address2 = $db_field['address2'];
$address3 = $db_field['address3'];
$address4= $db_field['address4'];
$address5 = $db_field['address5'];
$postcode = $db_field['postcode'];
$bo_tel = $db_field['BO_tel'];
$bo_email = $db_field['BO_email'];
$bc_name = $db_field['BC_name'];
$equity_contract = $db_field['equity_contract'];
echo "<pre>";
foreach ($row as $value) {
echo $dealer_code . " ";
echo $dealer_name . " ";
echo $bodyshop_id . " ";
echo $bodyshop_name . " ";
echo $address1 . " ";
echo $address2 . " ";
echo $address3 . " ";
echo $address4 . " ";
echo $address5 . " ";
echo $postcode . " ";
echo $bo_tel . " ";
echo $bo_email . " ";
echo $bc_name . " ";
echo $equity_contract . " ";
echo $value. "<BR>";
fputcsv($outstream, $row, ',', '"');
}
echo "</pre>";
}
mysql_close($db_handle);
} else {
print "Database NOT Found ";
mysql_close($db_handle);
fclose($outstream);
}
?>
好吧,你在这里做了一些非常奇怪的事情。您通过两种方式输出内容。
首先,使用echo
以正常方式输出内容。很公平!
其次,使用fputcsv
输出内容,其中文件处理程序指向php://output
。也很公平!
但你不应该同时做这两件事,并期望它能无缝工作。您想要一个CSV文件,所以最好的方法是使用fputcsv
输出所有数据。目前,您的一些数据被封装为CSV文件,而有些则不是。这导致了你并不真正想要的输出。
我认为你想要这样的东西:
foreach ($row as $value) {
$output = array(
$dealer_code,
$dealer_name,
$bodyshop_id,
$bodyshop_name,
$address1,
$address2,
$address3,
$address4,
$address5,
$postcode,
$bo_tel,
$bo_email,
$bc_name.
$equity_contract,
$value
);
fputcsv($outstream, $output, ',', '"');
}
fputcsv
希望数据是一个数组,所以我们给出的就是这个。单独的数组字段将是CSV输出中的单独列。我们不echo
任何数据:我们将其存储在一个数组中,然后将其提供给fputcsv
。
您犯的第二个错误是将$row
而不是$value
发送到fputcsv
。这意味着您发送的是从数据库行收到的所有邮政编码。
最后,您不需要<pre>
。
另一方面,实际上应该有一个更好的数据库结构。如果你有一个邮政编码表和一个单独的实体店表,以及一个链接它们的外键,那么检索数据的代码会简单得多,将来搜索和更新数据也是如此。