it-swarm.com.de

Erstellen Sie eine CSV-Datei für einen Benutzer in PHP

Ich habe Daten in einer MySQL-Datenbank. Ich sende dem Benutzer eine URL, um seine Daten als CSV-Datei zu erhalten.

Ich habe das E-Mailen des Links, der MySQL-Abfrage usw. abgedeckt.

Wie kann ich, wenn sie auf den Link klicken, ein Popup-Fenster zum Herunterladen eines CVS mit dem Datensatz von MySQL öffnen?

Ich habe alle Informationen, um die Aufzeichnung bereits zu erhalten. Ich verstehe nur nicht, wie man PHP die CSV-Datei erstellt und sie eine Datei mit der Erweiterung .csv herunterladen lässt.

215
Jason

Versuchen:

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;

usw

Bearbeiten: Hier ist ein Codeausschnitt, den ich verwende, um optional CSV-Felder zu kodieren:

function maybeEncodeCSVField($string) {
    if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {
        $string = '"' . str_replace('"', '""', $string) . '"';
    }
    return $string;
}
277
Oleg Barshay
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); // here you can change delimiter/Enclosure
  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")
));

php: // output
fputcsv

459

Hier ist eine verbesserte Version der Funktion von php.net, die @Andrew gepostet hat.

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);
}

Es ist sehr einfach zu bedienen und funktioniert hervorragend mit MySQL (i)/PDO-Ergebnismengen.

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

Denken Sie daran, exit() aufzurufen, wenn Sie mit der Seite fertig sind.

18
Xeoncross

Zusätzlich zu allem, was bereits gesagt wurde, müssen Sie möglicherweise Folgendes hinzufügen:

header("Content-Transfer-Encoding: UTF-8");

Dies ist sehr nützlich, wenn Sie Dateien mit mehreren Sprachen bearbeiten, z. B. Namen von Personen oder Städte.

16
Stan

Der Thread ist ein wenig alt, ich weiß, aber für zukünftige Referenz und für Noobs wie ich:

Alle anderen erklären hier, wie die CSV erstellt wird, aber ein grundlegender Teil der Frage fehlt: Wie wird eine Verknüpfung hergestellt? Um zum Download der CSV-Datei zu verlinken, verlinken Sie einfach auf die .php-Datei, die wiederum als .csv-Datei reagiert. Die PHP Header machen das. Dies ermöglicht coole Sachen, wie das Hinzufügen von Variablen zum Querystring und das Anpassen der Ausgabe:

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

my_csv_creator.php kann mit den im Querystring angegebenen Variablen arbeiten und beispielsweise andere oder angepasste Datenbankabfragen verwenden, die Spalten der CSV ändern, den Dateinamen personalisieren und so weiter, z.

User_John_Doe_10_Dec_11.csv
9
LBJ

Erstellen Sie Ihre Datei, und geben Sie einen Verweis mit dem richtigen Header zurück, um das Speichern unter auszulösen. Bearbeiten Sie Folgendes nach Bedarf. Fügen Sie Ihre CSV-Daten in $ csvdata ein.

$fname = 'myCSV.csv';
$fp = fopen($fname,'wb');
fwrite($fp,$csvdata);
fclose($fp);

header('Content-type: application/csv');
header("Content-Disposition: inline; filename=".$fname);
readfile($fname);
7
typemismatch

Hier ist ein voll funktionsfähiges Beispiel mit PDO und Spaltenüberschriften:

$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);
}
5
Justin

Machen Sie zuerst Daten als String mit Komma als Trennzeichen (getrennt mit ","). Etwas wie das

$CSV_string="No,Date,Email,Sender Name,Sender Email \n"; //making string, So "\n" is used for newLine

$Rand = Rand(1,50); //Make a random int number between 1 to 50.
$file ="export/export".$Rand.".csv"; //For avoiding cache in the client and on the server 
                                     //side it is recommended that the file name be different.

file_put_contents($file,$CSV_string);

/* Or try this code if $CSV_string is an array
    fh =fopen($file, 'w');
    fputcsv($fh , $CSV_string , ","  , "\n" ); // "," is delimiter // "\n" is new line.
    fclose($fh);
*/
4

Hey es funktioniert sehr gut .... !!!! Danke Peter Mortensen und Connor Burton

<?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;
}

?>

3
Kaddy

Einfache Methode -

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

$fp = fopen('data.csv', 'wb');
foreach($data as $line){
    $val = explode(",",$line);
    fputcsv($fp, $val);
}
fclose($fp);

Also jede Zeile des $data array wechselt in eine neue Zeile Ihrer neu erstellten CSV-Datei. Es funktioniert nur für PHP 5 und höher.

2
user244641

Sie können Ihre Daten einfach mit der Funktion fputcsv in CSV schreiben. Schauen wir uns das folgende Beispiel an. Schreiben Sie das Listenarray in eine CSV-Datei

$list[] = array("Cars", "Planes", "Ships");
$list[] = array("Car's2", "Planes2", "Ships2");
//define headers for CSV 
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=file_name.csv');
//write data into CSV
$fp = fopen('php://output', 'wb');
//convert data to UTF-8 
fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($list as $line) {
    fputcsv($fp, $line);
}
fclose($fp);
2
Shahbaz

Am einfachsten ist es, eine dedizierte CSV-Klasse wie folgt zu verwenden:

$csv = new csv();
$csv->load_data(array(
    array('name'=>'John', 'age'=>35),
    array('name'=>'Adrian', 'age'=>23), 
    array('name'=>'William', 'age'=>57) 
));
$csv->send_file('age.csv'); 
1
Sergiu

Anstatt von:

$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;
}

Verwenden:

$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))
{
    echo implode(",", $row)."\n";
}
1
Joshua

Es kam bereits eine sehr gute Lösung. Ich gebe nur den Gesamtcode ein, damit ein Neuling die totale Hilfe bekommt

<?php
extract($_GET); //you can send some parameter by query variable. I have sent table name in *table* variable

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=$table.csv");
header("Pragma: no-cache");
header("Expires: 0");

require_once("includes/functions.php"); //necessary mysql connection functions here

//first of all I'll get the column name to put title of csv file.
$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";

//now I'll bring the data.
$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) {
            //there may be separator (here I have used comma) inside data. So need to put double quote around such data.
        if(strpos($value, ',') !== false || strpos($value, '"') !== false || strpos($value, "\n") !== false) {
            $row[$key] = '"' . str_replace('"', '""', $value) . '"';
        }
    }
    echo implode(",", $row)."\n";
}

?>

Ich habe diesen Code in csv-download.php gespeichert

Nun sehen Sie, wie ich diese Daten zum Herunterladen der CSV-Datei verwendet habe

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

Wenn ich also auf den Link geklickt habe, wird die Datei heruntergeladen, ohne dass ich zur Seite csv-download.php im Browser weitergeleitet werde.

1
zahid9i

Wie schreibe ich in einer CSV-Datei mit PHP Skript? Eigentlich habe ich auch danach gesucht. Mit PHP ist das eine einfache Aufgabe. Fputs (Handler, Inhalt) - diese Funktion funktioniert bei mir effizient Zuerst müssen Sie die Datei, in die Sie Inhalte schreiben möchten, mit fopen öffnen ($ CSVFileName, 'wb').

$CSVFileName = “test.csv”;
$fp = fopen($CSVFileName, ‘wb’);

//Multiple iterations to append the data using function fputs()
foreach ($csv_post as $temp)
{
    $line = “”;
    $line .= “Content 1″ . $comma . “$temp” . $comma . “Content 2″ . $comma . “16/10/2012″.$comma;
    $line .= “\n”;
    fputs($fp, $line);
}
0
user1764198

Um es als CSV senden zu lassen und den Dateinamen anzugeben, verwenden Sie header ():

http://us2.php.net/header

header('Content-type: text/csv');
header('Content-disposition: attachment; filename="myfile.csv"');

Wenn Sie die CSV-Datei selbst erstellen möchten, müssen Sie nur die Ergebnismenge durchlaufen, die Ausgabe formatieren und senden, genau wie bei jedem anderen Inhalt.

0
Gavin M. Roy

Hier ist eine, die ich zuvor gemacht habe und die Daten zwischen bestimmten Daten erfasst hat. Ich hoffe es hilft.

<?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 = mysql_real_escape_string($_GET["start"]);
    $end = mysql_real_escape_string($_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;
    }
?>
0
Connor Burton
<?
    // Connect to database
    $result = mysql_query("select id
    from tablename
    where shid=3");
    list($DBshid) = mysql_fetch_row($result);

    /***********************************
    Write date to CSV file
    ***********************************/

    $_file = 'show.csv';
    $_fp = @fopen( $_file, 'wb' );

    $result = mysql_query("select name,compname,job_title,email_add,phone,url from UserTables where id=3");

    while (list( $Username, $Useremail_add, $Userphone, $Userurl) = mysql_fetch_row($result))
    {
        $_csv_data = $Username.','.$Useremail_add.','.$Userphone.','.$Userurl . "\n";
        @fwrite( $_fp, $_csv_data);
    }
    @fclose( $_fp );
?>
0
Vish00722

Das Schreiben eines eigenen CSV-Codes ist wahrscheinlich eine Zeitverschwendung. Verwenden Sie einfach ein Paket wie league/csv - es erledigt all die schwierigen Aufgaben für Sie, die Dokumentation ist gut und es ist sehr stabil/zuverlässig:

http://csv.thephpleague.com/

Sie müssen Composer verwenden. Wenn Sie nicht wissen, was composer ist, empfehle ich Ihnen dringend, einen Blick darauf zu werfen: https://getcomposer.org/

0
John Hunt