为什么fputcsv会产生重复的列?

时间:2014-05-06 03:59:53

标签: php mysql sql csv duplicates

我正在向WordPress网站添加一个下载按钮,该网站将查询我们的数据库,并以CSV格式提供结果。

一切正常,除了生成的CSV为其返回的每个列都有一个重复列。

我们检查了SQL查询,但它没有重复项。

以下是我们如何生成CSV:

$rows = //Call to SQL query function
$fp = fopen('php://output', 'w');
fputcsv($fp, array_keys($rows));

foreach ($rows as $row) {
  fputcsv($fp, $row);
}

$filename = "EventResults.csv";
header('Content-Type: text/csv');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=$filename");

我们将SQL返回到这样的PHP数组中:

 $sql = "SELECT * FROM TABLE";
 $statement = $this->db->prepare($sql);
 $statement->execute();
 return $statement->fetchAll();

结果如下:

Lance,Lance,Armstrong,Armstrong,DEX,DEX,70,70,1,1,60,60,SEC,SEC,"10; 20; 30; 40","10; 20; 30; 40"

当他们看起来像这样:

Lance,Armstrong,DEX,70,1,60,SEC,"10; 20; 30; 40"

导致重复的原因是什么,我们如何摆脱它们?

2 个答案:

答案 0 :(得分:6)

PDO方法fetchAll()有一个参数fetch_styleas documented将返回一个包含数字和命名关联键的数组,当你遍历数组时会导致重复。

您可以使用其中一个记录为here的PDO Fetch常量来设置它 - 它们都以PDO::FETCH_开头并使用它来获取关联数组(PDO::FETCH_ASSOC)或数值数组(PDO::FETCH_NUM

return $statement->fetchAll(PDO::FETCH_ASSOC);

答案 1 :(得分:0)

这在MSSQL中可以防止重复的列:

while ( $row = mssql_fetch_array($results, MSSQL_ASSOC) ) {
    fputcsv($fp, $row);     
}