Fre*_*ley 2 php csv codeigniter export
这不是问题,更多是从Codeigniter导出查询作为可下载CSV的最佳方式的请求.在CI中,我select * from members where country=123
从控制器中的模型(例如成员)中调用一个简单的查询(例如),其行如下:
$data['membercountries_query'] = $this -> Queries_model -> get_members_by_country($country_id);
Run Code Online (Sandbox Code Playgroud)
这将展示我在一个国家/地区的成员上显示人类可读信息的视图.我可以在视图或控制器中轻松生成此结果的CSV $this->dbutil->csv_from_result($membercountries_query)
,并在视图中显示它.然后,我想向用户显示按钮/超链接"以CSV格式下载结果",这将生成文件保存对话框.
我已经做了很多谷歌搜索和搜索SO,并有许多可能的解决方案,具有不同程度的复杂性.我想过可能会添加一个控制器功能(例如member/create_csv($data)
),但是想不出从页面链接传递CSV $数据的方法(完全可能是另一个问题).
有人可以建议用最简单,最快捷的方式创建CSV下载链接吗?出于安全原因,我不希望将CSV文件保存到服务器,然后创建指向已保存文件的链接.
能够创建一个通用的帮助器/函数来获取任何查询结果并生成可下载的CSV将特别有用.
我很感谢CI民间用于生产dbutil和下载助手,而这样做的最简单的方法必须同时涉及csv_from_result()
和force_download()
,但我想不出在的方式向两个视图结合时至今日(或随你) :(
我根据问题" 从codeigniter mysql下载csv "中的第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);
}
Run Code Online (Sandbox Code Playgroud)
在生成查询的控制器中,添加$ csv布尔参数,例如:
function membercountry($country_id = NULL, $csv = false)
Run Code Online (Sandbox Code Playgroud)
并且在控制器函数中有一个条件,如果$ csv为真或1,它将调用模型函数:
if ($csv)
{
$date = date('dmy');
$csvfile = "membercountry" . $date . ".csv";
$this -> Queries_model -> csv($data['membercountries_query'], $csvfile);
}
Run Code Online (Sandbox Code Playgroud)
然后在查询结果视图中,在浏览器中以人类可读的形式显示结果后,显示一个超链接:
<a href="queries/membercountry/<?=$country_id?>/1">Download result as CSV</a>
Run Code Online (Sandbox Code Playgroud)
单击时,它将$ csv重新调用控制器为true,然后调用模型函数csv().
这是我的应用程序的一个相当通用的解决方案,它只需要在控制器功能中添加一些额外的行,并节省将CSV文件写入服务器或具有详细和复杂标题的特定视图.这不是该解决方案,只是一个非常简单的快速和肮脏的解决方案,在这里CI开发人员可能会发现有用.再一次,非常感谢CI社区创建dbutils类,这使得输出CSV变得轻而易举.
编辑:从MVC的角度来看,将csv()函数放在控制器而不是模型中可能更整洁,并通过$ this - > csv()调用它.