Я думаю, что мне не хватает чего-то очевидного. Я пытаюсь экспортировать набор данных из MySQL-запроса в CSV, не распечатывая его в браузере.
Вот мой код:
<?php $this->load->helper('download'); $list = $stories; $fp = fopen('php://output', 'w'); foreach ($list as $fields) { fputcsv($fp, $fields); } $data = file_get_contents('php://output'); // Read the file's contents $name = 'data.csv'; force_download($name, $data); fclose($fp); ?>
$stories
– это массив, созданный из запроса MySQL.
В настоящее время все печатает в браузере без ошибок и без загрузки, но я хотел бы заставить загрузить CSV. Как я могу это сделать?
окончательный рабочий код:
$this->load->helper('download'); $list = $stories; $fp = fopen('php://output', 'w'); foreach ($list as $fields) { fputcsv($fp, $fields); } $data = file_get_contents('php://output'); $name = 'data.csv'; // Build the headers to push out the file properly. header('Pragma: public'); // required header('Expires: 0'); // no cache header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Cache-Control: private',false); header('Content-Disposition: attachment; filename="'.basename($name).'"'); // Add the file name header('Content-Transfer-Encoding: binary'); header('Connection: close'); exit(); force_download($name, $data); fclose($fp);
Я не могу определить, какие заголовки заданы из наборов force_download()
Codeigniter force_download()
. Если это действительно произойдет на экране, я бы заподозрил, что необходимые заголовки отсутствуют. Вы можете добавить приведенные ниже заголовки к своему коду, чтобы установить правильные заголовки dowload csv (управление кешем будет обеспечивать свежую загрузку данных каждый раз:
header('Content-Description: File Transfer'); header('Content-Type: application/csv'); header('Content-Disposition: attachment; filename='.$name); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file));
Вы можете вызвать модель CSV()
с вашего контроллера, как
$this->load->model('Users_model'); $this->Users_model->csv();
и в модели
function csv() { $this->load->dbutil(); $this->load->helper('file'); $this->load->helper('download'); $query = $this->db->query("SELECT * FROM Users"); $delimiter = ","; $newline = "\r\n"; $data = $this->dbutil->csv_from_result($query, $delimiter, $newline); force_download('CSV_Report.csv', $data); }
Ваш файл начнет загрузку
Если вы пытаетесь генерировать отчеты в формате csv, то с помощью codeigniter это будет довольно легко.
Поместите этот код в свой контроллер
function get_report() { $this->load->model('Main_Model'); $this->load->dbutil(); $this->load->helper('file'); /* get the object */ $report = $this->Main_Model->print_report(); $delimiter = ","; $newline = "\r\n"; $new_report = $this->dbutil->csv_from_result($report, $delimiter, $newline); write_file( 'application/third_party/file.csv', $new_report); $this->load->view('report_success.php'); }
Поместите этот код в модель
public function print_report() { return $query = $this->db->query("SELECT * FROM Table_name"); }
report_success.php
– это просто успешное уведомление.
Ваш отчет экспортируется. спасибо
Наконец, создается «файл.csv». его в основном хранится на физическом хранении. В CodeIgniter/application/third-party/file.csv
оно работает. это поможет вам.
Здесь мы получаем образец результата из MySQL и хотим экспортировать его в CSV-файл.
Шаг 1. Получите данные MySql в паре значений ключа.
$data = array( '0' => array('Name'=> 'Parvez', 'Status' =>'complete', 'Priority'=>'Low', 'Salary'=>'001'), '1' => array('Name'=> 'Alam', 'Status' =>'inprogress', 'Priority'=>'Low', 'Salary'=>'111'), '2' => array('Name'=> 'Sunnay', 'Status' =>'hold', 'Priority'=>'Low', 'Salary'=>'333'), '3' => array('Name'=> 'Amir', 'Status' =>'pending', 'Priority'=>'Low', 'Salary'=>'444'), '4' => array('Name'=> 'Amir1', 'Status' =>'pending', 'Priority'=>'Low', 'Salary'=>'777'), '5' => array('Name'=> 'Amir2', 'Status' =>'pending', 'Priority'=>'Low', 'Salary'=>'777') );
Шаг 2: PHP-код, чтобы получить тип параметров и заставить браузер загружать файл вместо отображения.
if(isset($_POST["ExportType"]))
{
switch($_POST["ExportType"]) { case "export-to-csv" : // Submission from $filename = $_POST["ExportType"] . ".csv"; header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-type: text/csv"); header("Content-Disposition: attachment; filename=\"$filename\""); ExportCSVFile($data); //$_POST["ExportType"] = ''; exit(); default : die("Unknown action : ".$_POST["action"]); break; }
}
function ExportCSVFile($records) { // create a file pointer connected to the output stream $fh = fopen( 'php://output', 'w' ); $heading = false; if(!empty($records)) foreach($records as $row) { if(!$heading) { // output the column headings fputcsv($fh, array_keys($row)); $heading = true; } // loop over the rows, outputting them fputcsv($fh, array_values($row)); } fclose($fh); }
Шаг 3: Определите html-макет для отображения данных в таблице и кнопке, чтобы запустить действие export-to-csv.
<div><a href="javascript:void(0)" id="export-to-csv">Export to csv</a></div> <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" id="export-form"> <input type="hidden" value='' id='hidden-type' name='ExportType'/> </form> <table id="" class="table table-striped table-bordered"> <tr> <th>Name</th> <th>Status</th> <th>Priority</th> <th>Salary</th> </tr> <tbody> <?php foreach($data as $row):?> <tr> <td><?php echo $row ['Name']?></td> <td><?php echo $row ['Status']?></td> <td><?php echo $row ['Priority']?></td> <td><?php echo $row ['Salary']?></td> </tr> <?php endforeach; ?> </tbody> </table>
Шаг 3: Теперь мы будем использовать код jQuery для получения события click.
<script type="text/javascript"> $(document).ready(function() { jQuery('#export-to-csv').bind("click", function() { var target = $(this).attr('id'); switch(target) { case 'export-to-csv' : $('#hidden-type').val(target); //alert($('#hidden-type').val()); $('#export-form').submit(); $('#hidden-type').val(''); break } }); }); </script>
я использую это и его работу
header('Content-Type: text/csv; charset=utf-8'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header("Content-Disposition: attachment; filename=backup" . date('ym-d') . ".csv"); header('Last-Modified: ' . date('DM j G:i:s T Y')); $outss = fopen("php://output", "w"); $this->db->order_by('ID', 'DESC'); $query = $this->db->get('urls'); foreach ($query->result_array() as $rows) { fputcsv($outss, $rows); } fclose($outss); return;