我有以下查询...
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输出放在不同的控制器中。
然而,它只是数据的主体(正如我预期的那样)。然而,我已经阅读了一些问题,我认为类似的事情,但在这个例子我需要列出标题的canot非常有效。手动输入,或者我将从sql查询中分配这些。答案 0 :(得分: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()
。默认情况下,它会写入文件句柄,但您也可以在内存中缓冲输出并将结果作为字符串like this example shows获取。