Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么fputcsv会产生重复的列?_Php_Mysql_Sql_Csv_Duplicates - Fatal编程技术网

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

Php 为什么fputcsv会产生重复的列?,php,mysql,sql,csv,duplicates,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) { fp

我正在向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"
结果如下所示:

 $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"
当它们看起来像这样时:

 $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"

是什么导致了重复,我们如何消除它们?

PDO方法
fetchAll()
有一个参数
fetch_style
,该参数将返回一个数组,其中包含数字键和命名关联键,从而在迭代数组时产生重复

您可以使用记录的其中一个PDO Fetch常量进行设置—它们都以
PDO::Fetch(
开头,并使用该常量获取关联数组(
PDO::Fetch(u ASSOC
)或数字数组(
PDO::Fetch)NUM


这在MSSQL中起作用,以防止重复列:

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

也许您正在使用一个函数来获取记录,该函数使用数字键和列名作为键返回记录?好的,仔细查看$row之后,似乎您是正确的。然而,我们不知道如何避免这种情况。有没有办法忽略这些值?我们可以移除它们吗?阻止它们进入阵列?您将如何处理这个问题?我同意@Maerlyn的观点,一些用php查询数据库的函数/库可以将结果集作为关联数组和数字索引数组,这可能是问题的根源。了解您是如何检索结果集是很有用的。@CaptainStack我会通过查看如何生成结果集并在那里进行修复来解决它,您能发布代码吗?@Alex.Ritna,问题肯定是它是键索引和数字索引的。我发布了如何将SQL转换为PHP数组。看到什么了吗?您将如何修复此问题?在我的情况下,我必须将mysql\u fetch\u array()更改为mysql\u fetch\u assoc()。