Web

Создание файла CSV для пользователя на PHP

У меня есть данные в базе данных MySQL. Я отправляю пользователю URL-адрес, чтобы получить его данные в виде файла CSV. У меня есть электронная почта со ссылкой, запросом MySQL и т. д.

Как я могу, когда пользователь щелкает ссылку, получать всплывающее окно для загрузки CSV с записью из MySQL? У меня уже есть вся информация, чтобы получить запись. Я просто не понимаю, как заставить PHP создать файл CSV и позволить пользователю загрузить файл с расширением .csv.

 

 

Ответ 1

header("Content-Type: text/csv");

header("Content-Disposition: attachment; filename=file.csv");

 function outputCSV($data) {

  $output = fopen("php://output", "wb");

  foreach ($data as $row)

    fputcsv($output, $row); // здесь вы можете изменить разделитель/оболочку

  fclose($output);

}

 

outputCSV(array(

  array("name 1", "age 1", "city 1"),

  array("name 2", "age 2", "city 2"),

  array("name 3", "age 3", "city 3")

));

 

Ответ 2

Попытайтесь сделать следующее:

header("Content-type: text/csv");

header("Content-Disposition: attachment; filename=file.csv");

header("Pragma: no-cache");

header("Expires: 0");

echo "record1,record2,record3\n";

die;

Вот фрагмент кода, который я использую для необязательного кодирования полей CSV:

function maybeEncodeCSVField($string) {

    if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {

        $string = '"' . str_replace('"', '""', $string) . '"';

    }

    return $string;

}

 

Ответ 3

Вот улучшенная версия функции с php.net:

function download_csv_results($results, $name = NULL) {

    if( ! $name) {

        $name = md5(uniqid() . microtime(TRUE) . mt_rand()). '.csv';

    }

    header('Content-Type: text/csv');

    header('Content-Disposition: attachment; filename='. $name);

    header('Pragma: no-cache');

    header("Expires: 0");

    $outstream = fopen("php://output", "wb");

    foreach($results as $result) {

        fputcsv($outstream, $result);

    }

    fclose($outstream);

}

Он действительно прост в использовании и отлично работает с наборами результатов MySQL(i)/PDO.

download_csv_results($results, 'your_name_here.csv');

 

Не забудьте вызвать exit() после того, как вы закончили работу со страницей.

 

Ответ 4

В предыдущих ответах объясняют, как создать CSV, но упускают основную часть вопроса: как сделать ссылку. Чтобы сделать ссылку на загрузку CSV-файла, вы просто ссылаетесь на .php-файл, который в свою очередь отвечает как .csv-файл. Это делают заголовки PHP. Это позволяет делать такие классные вещи, как добавление переменных в строку запроса и настройку вывода:

<a href="my_csv_creator.php?user=23&amp;othervariable=true">Get CSV</a>

my_csv_creator.php может работать с переменными, указанными в строке запроса, и, например, использовать различные или адаптированные запросы к базе данных, изменять столбцы CSV, персонализировать имя файла и так далее, например:

User_John_Doe_10_Dec_20.csv

 

Ответ 5

Вот полный рабочий пример, использующий PDO и включающий заголовки столбцов:

$query = $pdo->prepare('SELECT * FROM test WHERE id=?');

$query->execute(array($id));    

$results = $query->fetchAll(PDO::FETCH_ASSOC);

download_csv_results($results, 'test.csv'); 

exit();

 

function download_csv_results($results, $name) {            

    header('Content-Type: text/csv');

    header('Content-Disposition: attachment; filename='. $name);

    header('Pragma: no-cache');

    header("Expires: 0");

    $outstream = fopen("php://output", "wb");    

    fputcsv($outstream, array_keys($results[0]));

    foreach($results as $result) {

        fputcsv($outstream, $result);

    }

    fclose($outstream);

}

 

Ответ 6

Этот код работает очень хорошо:

<?php

header("Content-type: application/csv");

header("Content-Disposition: attachment; filename=file.csv");

header("Pragma: no-cache");

header("Expires: 0");

ini_set('display_errors',1);

$private=1;

error_reporting(E_ALL ^ E_NOTICE);

mysql_connect("localhost", "user", "pass") or die(mysql_error());

mysql_select_db("db") or die(mysql_error());

$start = $_GET["start"];

$end = $_GET["end"];

$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00'  AND created<='{$end} 23:59:59'   ORDER BY id";

$select_c = mysql_query($query) or die(mysql_error());

 

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC)) {

    $result.="{$row['email']},";

    $result.="\n";

    echo $result;

}

 

Ответ 7

В предыдущем ответе очень хорошее решение. Я просто выкладываю весь код, чтобы новичок получил полную помощь.

<?php

extract($_GET); //Вы можете отправить какой-либо параметр через переменную запроса. Я отправил имя таблицы в переменной *table*.

 header("Content-type: text/csv");

header("Content-Disposition: attachment; filename=$table.csv");

header("Pragma: no-cache");

header("Expires: 0");

require_once("includes/functions.php"); //необходимые функции подключения к mysql здесь

 

//сначала я получу имя столбца, чтобы поместить заголовок csv-файла.

$query = "SHOW columns FROM $table";

$headers = mysql_query($query) or die(mysql_error());

$csv_head = array();

while ($row = mysql_fetch_array($headers, MYSQL_ASSOC)) {

    $csv_head[] =  $row['Field'];

}

echo implode(",", $csv_head)."\n";

//теперь я приведу данные.

 

$query = "SELECT * FROM $table";

$select_c = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC)) {

    foreach ($row as $key => $value) {

            //внутри данных может быть разделитель (здесь я использовал запятую). Поэтому такие данные нужно заключить в двойную кавычку.

        if(strpos($value, ',') !== false || strpos($value, '"') !== false || strpos($value, "\n") !== false) {

            $row[$key] = '"' . str_replace('"', '""', $value) . '"';

        }

    }

    echo implode(",", $row)."\n";

}

?>

Я сохранил этот код в файле csv-download.php. Теперь посмотрите, как я использовал эти данные для загрузки файла csv:

<a href="csv-download.php?table=tbl_vfm"><img title="Download as Excel" src="images/Excel-logo.gif" alt="Download as Excel" /><a/>

 

Когда я нажимаю на ссылку, она загружает файл, не переводя меня на страницу csv-download.php в браузере.

 

Схожие статьи

Поисковый алгоритм Яндекса «Королев»: список функций и особенностей
Web

Поисковый алгоритм Яндекса «Королев»: список функций и особенностей

Web

Регулярное выражение с атрибутами шорткодов Wordpress

Web

Есть ли способ обновить расширение через composer и обойти ошибку ограничения памяти в Magento2

Web

Множественные выходы из функции