0

次のクエリがあります...

    public function get_invoice_user_summary_csv($invoice_table_id)
    {
    $sql_get_user_summ = "
                            SELECT `billingHistory`.`$invoice_table_id`.userId as userId, ipCore.users.firstname, ipCore.users.surname, COUNT(`billingHistory`.`$invoice_table_id`.id) AS totalNum, SUM(`billingHistory`.`$invoice_table_id`.durationSeconds) AS totalDuration, (SUM(`billingHistory`.`$invoice_table_id`.priceMin)+SUM(`billingHistory`.`$invoice_table_id`.priceCon)) AS totalCost
                            FROM `billingHistory`.`$invoice_table_id`
                            LEFT JOIN ipCore.users ON `billingHistory`.`$invoice_table_id`.userId = ipCore.users.id
                            GROUP BY userId
                            ORDER BY ipCore.users.surname ASC, ipCore.users.firstname ASC;";

    $query = $this->db_mtvm->query($sql_get_user_summ);
    if($query->num_rows() > 0)
        {
        foreach ($query->result_array() as $row)
            {
            $line = '';
            $value = '';
            foreach($row as $value)
                {
                if((!isset($value)) || ($value == ""))
                    {
                    $value = ",";
                    }
                else
                    {
                    $value = str_replace( '"' , '""' , $value );
                    $value = '"' . $value . '"' . ",";
                    }
                $line .= $value;
                }
            print substr(str_replace("\r", "", trim($line)), 0, -1)."\r\n";
            flush();
            ob_flush();
            }
        }
    else return false;
    }

これは、別のコントローラーに出力されたcsv出力のフォーマットされた配列を返します。

ただし、それは単なるデータ本体です(予想どおり)。ただし、同様のことを考えているいくつかの質問を読みましたが、列見出しを配置する必要があるこの例ではうまくいきません。手動で入力するか、SQL クエリからこれらを割り当てます。

4

1 に答える 1

2

次のようにして、結果をループします。

foreach ($query->result_array() as $row)

このループの最初の繰り返しで、列ヘッダーを取得して出力するように、スクリプトを変更する必要があります。これを行う簡単な方法は、上で引用した行を次のように変更することです。

$i = 0;
foreach ($query->result_array() as $row)
{
    if($i === 0)
        echo implode(",", array_keys($row)) . "\r\n";
    $i++;
    [...]

CSV 文字列を自分で作成していることに気付きました。これを行う簡単な方法は、 を使用することfputcsv()です。デフォルトでは、ファイル ハンドルに書き込みますが、この例が示すように、出力をメモリにバッファリングし、結果を文字列としてフェッチすることもできます。

于 2012-10-31T15:10:15.617 に答える