簡體   English   中英

PHP MySQL表以列名轉換為CSV

[英]PHP MySQL table to CSV with column names

我有以下將表輸出到CSV文件的php函數。 我還需要第一行中的列名。 它可以工作,但是它有一個帶有名稱的列,然后是一個相同的列,但不是名稱,而是列號。 我已經嘗試了很多解決方案以輸出到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);
        }

您需要將獲取模式設置為僅關聯模式,而不是兩者都設置。

http://www.php.net/manual/zh/pdostatement.setfetchmode.php

PDO :: FETCH_ASSOC(整數)指定fetch方法應將每一行作為由列名索引的數組返回,並在相應的結果集中返回。 如果結果集包含具有相同名稱的多個列,則PDO :: FETCH_ASSOC每個列名稱僅返回一個值。 http://www.php.net/manual/zh/pdo.constants.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM