PHP到CSV未正确输出字段


PHP to CSV not outputting fields correctly

我正试图将我的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>

另一方面,实际上应该有一个更好的数据库结构。如果你有一个邮政编码表和一个单独的实体店表,以及一个链接它们的外键,那么检索数据的代码会简单得多,将来搜索和更新数据也是如此。