这不是一个问题,更多的是从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()
,但我无法想到这种在一个视图(或其他)中组合两者的方法的最后一小时:(
答案 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');