Export nach CSV über PHP

Lesezeit: 5 Minuten

Angenommen, ich habe eine Datenbank … gibt es eine Möglichkeit, das, was ich aus der Datenbank habe, in eine CSV-Datei (und eine Textdatei) zu exportieren [if possible]) über PHP?

Export nach CSV uber PHP
Alain Timblo

Ich persönlich verwende diese Funktion, um CSV-Inhalte aus einem beliebigen Array zu erstellen.

function array2csv(array &$array)
{
   if (count($array) == 0) {
     return null;
   }
   ob_start();
   $df = fopen("php://output", 'w');
   fputcsv($df, array_keys(reset($array)));
   foreach ($array as $row) {
      fputcsv($df, $row);
   }
   fclose($df);
   return ob_get_clean();
}

Dann können Sie Ihren Benutzer dazu bringen, diese Datei herunterzuladen, indem Sie Folgendes verwenden:

function download_send_headers($filename) {
    // disable caching
    $now = gmdate("D, d M Y H:i:s");
    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
    header("Last-Modified: {$now} GMT");

    // force download  
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");

    // disposition / encoding on response body
    header("Content-Disposition: attachment;filename={$filename}");
    header("Content-Transfer-Encoding: binary");
}

Anwendungsbeispiel:

download_send_headers("data_export_" . date("Y-m-d") . ".csv");
echo array2csv($array);
die();

  • Auf dem lokalen Server funktioniert es, aber auf einem entfernten Server wird eine neue Seite mit Inhalt und ohne Download-Fenster angezeigt (Entschuldigung für mein Englisch).

    – khaled_webdev

    28. Dezember 2012 um 8:27 Uhr

  • Es kann mehrere Gründe für Fehler geben, der einfachste Weg, sie zu finden, ist, sich Ihre Apache error.log-Datei anzusehen.

    – Alain Tiemblo

    28. Dezember 2012 um 18:01 Uhr

  • Sie müssen ein setzen die(); kurz danach anrufen echo array2csv();, wird meine Antwort bearbeiten. Stellen Sie sicher, dass Sie Ihre CSV-Datei generieren, bevor Sie etwas auf Ihrer Seite ausgeben.

    – Alain Tiemblo

    6. Juni 2013 um 17:29 Uhr

  • @ring0 Ich denke, das Einfügen des vergangenen Datums in die Kopfzeile deaktiviert das Seiten-Caching, siehe 2. Beispiel php.net/manual/en/function.header.php

    – Abhishek Madhani

    22. Oktober 2014 um 13:50 Uhr


  • Gibt Ihrem Browser Mime-Typen, sodass Sie anstelle der im aktuellen Fenster gerenderten CSV-Datei ein Download-Modal erhalten.

    – Alain Tiemblo

    7. Oktober 2015 um 14:15 Uhr

Mit diesem Befehl können Sie das Datum exportieren.

<?php

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'),
    array('123', '456', '789'),
    array('"aaa"', '"bbb"')
);

$fp = fopen('file.csv', 'w');

foreach ($list as $fields) {
    fputcsv($fp, $fields);
}

fclose($fp);
?>

Zuerst müssen Sie die Daten vom MySQL-Server in ein Array laden

  • Oder Sie können fputcsv() innerhalb einer Standard-Fetch-Assoc-Schleife ausführen und es direkt aus den zurückgegebenen Ergebnissen ziehen.

    – DämpferS8N

    22. November 2010 um 19:38 Uhr

  • @DampeS8N, +1 für die Verwendung von “plop it down straight out” in einem Satz.

    – Sardellenlegende

    31. Dezember 2013 um 19:31 Uhr


  • dies wird ohne Namensnennung aus dem PHP-Handbuch für kopiert fputcsv

    – BenK

    11. Juli 2019 um 17:54 Uhr

Nur fürs Protokoll, die Verkettung ist viel schneller (ich meine es ernst) als fputcsv oder auch implode; Und die Dateigröße ist kleiner:

// The data from Eternal Oblivion is an object, always
$values = (array) fetchDataFromEternalOblivion($userId, $limit = 1000);

// ----- fputcsv (slow)
// The code of @Alain Tiemblo is the best implementation
ob_start();
$csv = fopen("php://output", 'w');
fputcsv($csv, array_keys(reset($values)));
foreach ($values as $row) {
    fputcsv($csv, $row);
}
fclose($csv);
return ob_get_clean();

// ----- implode (slow, but file size is smaller)
$csv = implode(",", array_keys(reset($values))) . PHP_EOL;
foreach ($values as $row) {
    $csv .= '"' . implode('","', $row) . '"' . PHP_EOL;
}
return $csv;
// ----- concatenation (fast, file size is smaller)
// We can use one implode for the headers =D
$csv = implode(",", array_keys(reset($values))) . PHP_EOL;
$i = 1;
// This is less flexible, but we have more control over the formatting
foreach ($values as $row) {
    $csv .= '"' . $row['id'] . '",';
    $csv .= '"' . $row['name'] . '",';
    $csv .= '"' . date('d-m-Y', strtotime($row['date'])) . '",';
    $csv .= '"' . ($row['pet_name'] ?: '-' ) . '",';
    $csv .= PHP_EOL;
}
return $csv;

Dies ist das Ergebnis der Optimierung mehrerer Berichte, von zehn bis zu tausend Zeilen. Die drei Beispiele funktionierten gut unter 1000 Zeilen, schlagen jedoch fehl, wenn die Daten größer waren.

Export nach CSV uber PHP
Bernhard Leichte

Funktioniert mit über 100 Zeilen, wenn Sie die Größe der Datei in den Headern angeben, rufen Sie einfach die Methode get() in Ihrer eigenen Klasse auf

function setHeader($filename, $filesize)
{
    // disable caching
    $now = gmdate("D, d M Y H:i:s");
    header("Expires: Tue, 01 Jan 2001 00:00:01 GMT");
    header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
    header("Last-Modified: {$now} GMT");

    // force download  
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header('Content-Type: text/x-csv');

    // disposition / encoding on response body
    if (isset($filename) && strlen($filename) > 0)
        header("Content-Disposition: attachment;filename={$filename}");
    if (isset($filesize))
        header("Content-Length: ".$filesize);
    header("Content-Transfer-Encoding: binary");
    header("Connection: close");
}

function getSql()
{
    // return you own sql
    $sql = "SELECT id, date, params, value FROM sometable ORDER BY date;";
    return $sql;
}

function getExportData()
{
    $values = array();

    $sql = $this->getSql();
    if (strlen($sql) > 0)
    {
        $result = dbquery($sql); // opens the database and executes the sql ... make your own ;-) 
        $fromDb = mysql_fetch_assoc($result);
        if ($fromDb !== false)
        {
            while ($fromDb)
            {
                $values[] = $fromDb;
                $fromDb = mysql_fetch_assoc($result);
            }
        }
    }
    return $values;
}

function get()
{
    $values = $this->getExportData(); // values as array 
    $csv = tmpfile();

    $bFirstRowHeader = true;
    foreach ($values as $row) 
    {
        if ($bFirstRowHeader)
        {
            fputcsv($csv, array_keys($row));
            $bFirstRowHeader = false;
        }

        fputcsv($csv, array_values($row));
    }

    rewind($csv);

    $filename = "export_".date("Y-m-d").".csv";

    $fstat = fstat($csv);
    $this->setHeader($filename, $fstat['size']);

    fpassthru($csv);
    fclose($csv);
}

1646924646 963 Export nach CSV uber PHP
StigM

Ich empfehle parsecsv-für-php um eine Reihe von Problemen mit verschachtelten Zeilenumbrüchen und Anführungszeichen zu umgehen.

1646924647 343 Export nach CSV uber PHP
Umair Idrees

vorgefertigter Code hier angehängt. Sie können es verwenden, indem Sie einfach Ihren Code kopieren und einfügen:

https://gist.github.com/umairidrees/8952054#file-php-save-db-table-as-csv

Export nach CSV uber PHP
James S

Genau wie @Dampes8N sagte:

$result = mysql_query($sql,$conecction);
$fp = fopen('file.csv', 'w');
while($row = mysql_fetch_assoc($result)){
    fputcsv($fp, $row);
}
fclose($fp);

Hoffe das hilft.

988280cookie-checkExport nach CSV über PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy