PHP MySQL表到CSV的列名

时间:2013-12-30 20:17:57

标签: php mysql arrays csv

我有以下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);
        }

1 个答案:

答案 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