我有以下php函数将表输出到CSV文件。我还需要第一行中的列名。但是它有一个带有名称的列,然后是一个相同的列,但它不是名称,而是列号。我已经尝试了很多解决方案来输出到CSV,这个对我来说效果最好。但对于我的生活,我无法弄清楚为什么我得到重复的列。我喜欢这个解决方案,因为它干净而简单。这里还有其他解决方案。我想知道我可以让这个工作吗?
我尝试使用查询,并使用“UNION ALL”,但它对我来说效果不好:
SELECT * INTO OUTFILE "c:/mydata4.csv" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n' FROM tickets
我的功能最好的是:
public function tickets_to_csv() {
$query = $this -> db -> prepare("SELECT * FROM tickets");
try {
$query -> execute();
$data = $query -> fetchAll();
$fp = fopen('report.csv', 'w');
$column_names = array_keys($data[0]);
fputcsv($fp, $column_names);
foreach ($data as $row) {
fputcsv($fp, $row);
}
fclose($fp);
} catch(PDOException $e) {
die($e -> getMessage());
}
}
它创建一个看起来像这样的文件
Column_1 | 0 | Column_2 | 1 |
Val_1-1 | Val_1-1 | Val_2-1 | Val_2-1 |
Val_1-2 | Val_1-2 | Val_2-2 | Val_2-2 |
Val_1-3 | Val_1-3 | Val_2-3 | Val_2-3 |
对我来说,这应该可以正常工作。
编辑:
这是我对@Jessicas答案的解决方案,改为:
$data = $query -> fetchAll(PDO::FETCH_ASSOC);
另外,我编辑了这部分,为每一行创建一个新行。否则在excel看起来很好,但如果在记事本中打开,那就是一行。这是解决方案:
$query -> execute();
$new_line = "\r\n";
$data = $query -> fetchAll(PDO::FETCH_ASSOC);
$fp = fopen('report.csv', 'w');
$column_names = array_keys($data[0]);
$column_names[] = $new_line;
fputcsv($fp, $column_names);
foreach ($data as $row) {
$row[] = $new_line;
fputcsv($fp, $row);
}
答案 0 :(得分:4)
您需要将获取模式设置为仅关联,而不是两者。
http://www.php.net/manual/en/pdostatement.setfetchmode.php
PDO :: FETCH_ASSOC(整数) 指定fetch方法应将每一行返回为由相应结果集中返回的列名索引的数组。如果结果集包含多个具有相同名称的列,则PDO :: FETCH_ASSOC每个列名称仅返回一个值。 http://www.php.net/manual/en/pdo.constants.php