Codeigniter并生成CSV文件

时间:2014-09-29 20:28:36

标签: php codeigniter csv export

这不是一个问题,更多的是从Codeigniter导出查询作为可下载CSV的最佳方式的请求。在CI中,我从控制器中的模型(例如成员)中调用一个简单的查询(例如select * from members where country=123),其行是:

$data['membercountries_query'] = $this -> Queries_model -> get_members_by_country($country_id);

这是一个视图,我在那里显示一个国家成员的人类可读信息。我可以使用$this->dbutil->csv_from_result($membercountries_query)在视图或控制器中轻松生成此结果的CSV,并将其显示在视图中。然后,我想向用户显示按钮/超链接"将结果下载为CSV",这将生成文件保存对话框。

我在搜索引擎优化上进行了大量的谷歌搜索和搜索,并且有许多可能的解决方案具有不同程度的复杂性。我想过可能会添加一个控制器函数(例如member/create_csv($data)),但是没有想到从页面链接传递CSV $数据的方法(可能完全是另一个问题)。

有人可以建议使用最简单,最快捷的方式创建CSV下载链接吗?出于安全原因,我不希望将CSV文件保存到服务器,然后创建指向已保存文件的链接。

能够创建一个可以获取任何查询结果并生成可下载CSV的通用帮助器/函数将特别有用。

我很感谢CI民众制作dbutil和下载助手,最简单的方法必须包括csv_from_result()force_download(),但我无法想到这种在一个视图(或其他)中组合两者的方法的最后一小时:(

3 个答案:

答案 0 :(得分:6)

基于问题" Download csv from codeigniter mysql"中的第3个解决方案,我提出了一个相当简单的解决方案,即具有模型功能:

function csv($query, $filename = 'CSV_Report.csv')
{
        $this->load->dbutil();
        $this->load->helper('file');
        $this->load->helper('download');
        $delimiter = ",";
        $newline = "\r\n";
        $data = $this->dbutil->csv_from_result($query, $delimiter, $newline);
        force_download($filename, $data);
}

在生成查询的控制器中,添加$ csv布尔参数,例如:

function membercountry($country_id = NULL, $csv = false)

并且在控制器函数中有一个条件,如果$ csv为真或1:

将调用模型函数
    if ($csv)
    {
        $date = date('dmy');
        $csvfile = "membercountry" . $date . ".csv";
        $this -> Queries_model -> csv($data['membercountries_query'], $csvfile);
    }

然后在查询结果视图中,在浏览器中以人类可读的形式显示结果后,显示一个超链接:

<a href="queries/membercountry/<?=$country_id?>/1">Download result as CSV</a>

单击时,它将$ csv重新调用控制器为true,然后调用模型函数csv()。

这是我的应用程序的一个相当通用的解决方案,它只需要在控制器功能中添加一些额外的行,并节省将CSV文件写入服务器或具有详细和复杂标题的特定视图。它不是 解决方案,只是一个相当简单的快速而肮脏的解决方案,CI开发人员可能会发现这些解决方案很有用。再一次,非常感谢CI社区创建dbutils class,这使得输出CSV变得轻而易举。

编辑:从MVC角度来看,将csv()函数放在控制器而不是模型中可能更整洁,并通过$ this - &gt;调用它。 CSV()。

答案 1 :(得分:2)

模型中的Blockquote

$this->load->dbutil();
$q=$this->db->query("select * from student order by idate desc");
$delimiter = ",";
$newline = "\r\n";
return $this->dbutil->csv_from_result($q,$delimiter,$newline);

在控制器中

$this->load->helper('download');
$this->load->model('mdl');
$row  = $this->mdl->getall();
$name = 'mycsv.csv';
force_download($name,$row);

答案 2 :(得分:0)

你只需要为codeigniter下载csv helper文件并运行你喜欢它的脚本

 $this->db->select('*')->from('*'); 
 $query = $this->db->get('your_table');
$this->load->helper('csv');
query_to_csv($query, TRUE, 'filename.csv');