2008-09-24 8 views
105

Was ist der effizienteste Weg, um eine MySQL-Anfrage in CSV in PHP zu konvertieren bitte?PHP-Code zum Konvertieren einer MySQL-Anfrage in CSV

Es wäre am besten, temporäre Dateien zu vermeiden, da dies die Portabilität verringert (Verzeichnispfade und Festlegen von Dateisystemberechtigungen erforderlich).

Die CSV sollte auch eine obere Zeile von Feldnamen enthalten.

+56

Warum wurde diese Frage als nicht konstruktiv geschlossen? Dieser ist in Ordnung und vollkommen klar. – Mario

+12

@Alec Da einige Moderatoren hier Supermoderatoren sind, weißt du ... "Mit Superkräften kommt große Verantwortung!" - Onkel Ben – finitenessofinfinity

+16

@finitenessofinfinity Macht korrumpiert, absolute Macht korrumpiert absolut. Stackoverflow ist ein hervorragendes Beispiel dafür. – Mario

Antwort

119
SELECT * INTO OUTFILE "c:/mydata.csv" 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY "\n" 
FROM my_table; 

(die Dokumentation dafür ist hier: http://dev.mysql.com/doc/refman/5.0/en/select.html)

oder:

$select = "SELECT * FROM table_name"; 

$export = mysql_query ($select) or die ("Sql error : " . mysql_error()); 

$fields = mysql_num_fields ($export); 

for ($i = 0; $i < $fields; $i++) 
{ 
    $header .= mysql_field_name($export , $i) . "\t"; 
} 

while($row = mysql_fetch_row($export)) 
{ 
    $line = ''; 
    foreach($row as $value) 
    {            
     if ((!isset($value)) || ($value == "")) 
     { 
      $value = "\t"; 
     } 
     else 
     { 
      $value = str_replace('"' , '""' , $value); 
      $value = '"' . $value . '"' . "\t"; 
     } 
     $line .= $value; 
    } 
    $data .= trim($line) . "\n"; 
} 
$data = str_replace("\r" , "" , $data); 

if ($data == "") 
{ 
    $data = "\n(0) Records Found!\n";       
} 

header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=your_desired_name.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
print "$header\n$data"; 
+5

technisch ist dies Tab-getrennt;) –

+5

Beachten Sie die Verwendung von Schrägstrichen mit "SELECT INTO OUTFILE" auch unter Windows. – Johan

+1

Hii das funktioniert gut für XLS-Format, aber wenn ich versuche, als CSV-Datei zu speichern, zeigt es alle Ergebnisse in 1 Spalte. Ich möchte dies als CSV-Datei speichern. –

3
// Export to CSV 
if($_GET['action'] == 'export') { 

    $rsSearchResults = mysql_query($sql, $db) or die(mysql_error()); 

    $out = ''; 
    $fields = mysql_list_fields('database','table',$db); 
    $columns = mysql_num_fields($fields); 

    // Put the name of all fields 
    for ($i = 0; $i < $columns; $i++) { 
    $l=mysql_field_name($fields, $i); 
    $out .= '"'.$l.'",'; 
    } 
    $out .="\n"; 

    // Add all values in the table 
    while ($l = mysql_fetch_array($rsSearchResults)) { 
    for ($i = 0; $i < $columns; $i++) { 
     $out .='"'.$l["$i"].'",'; 
    } 
    $out .="\n"; 
    } 
    // Output to browser with appropriate mime type, you choose ;) 
    header("Content-type: text/x-csv"); 
    //header("Content-type: text/csv"); 
    //header("Content-type: application/csv"); 
    header("Content-Disposition: attachment; filename=search_results.csv"); 
    echo $out; 
    exit; 
} 
20

Blick auf die documentation die SELECT in Bezug auf ... INTO OUTFILE Syntax.

SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt' 
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
    LINES TERMINATED BY '\n' 
    FROM test_table; 
81

Schauen Sie sich diese question/answer. Es ist prägnanter als @ Geoff und verwendet auch die eingebaute fputcsv-Funktion.

$result = $db_con->query('SELECT * FROM `some_table`'); 
if (!$result) die('Couldn\'t fetch records'); 
$num_fields = mysql_num_fields($result); 
$headers = array(); 
for ($i = 0; $i < $num_fields; $i++) { 
    $headers[] = mysql_field_name($result , $i); 
} 
$fp = fopen('php://output', 'w'); 
if ($fp && $result) { 
    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename="export.csv"'); 
    header('Pragma: no-cache'); 
    header('Expires: 0'); 
    fputcsv($fp, $headers); 
    while ($row = $result->fetch_array(MYSQLI_NUM)) { 
     fputcsv($fp, array_values($row)); 
    } 
    die; 
} 
+0

angeben, Ihr hat nicht die Spaltenüberschriften. –

+0

Ich habe die Spaltenüberschriften hinzugefügt – Jrgns

+13

Falls jemand anders so dumm ist wie ich, ersetzen Sie 'php: // output' nicht durch einen tatsächlichen Dateinamen oder versuchen Sie es am Ende mit' fclose' zu ​​schließen: es ist kein echtes Datei, nur ein Alias ​​für den Ausgabestrom. Wie auch immer, diese Antwort hat perfekt für mich funktioniert, danke Jrgns! –

4

Wenn Sie den Download möchten als Download angeboten werden, die direkt in Excel geöffnet werden kann, kann dies für Sie arbeiten: (von einem alten unreleased Projekt von mir kopiert)

Diese Funktionen Setup die Header:

function setExcelContentType() { 
    if(headers_sent()) 
     return false; 

    header('Content-type: application/vnd.ms-excel'); 
    return true; 
} 

function setDownloadAsHeader($filename) { 
    if(headers_sent()) 
     return false; 

    header('Content-disposition: attachment; filename=' . $filename); 
    return true; 
} 

Dieser sendet eine CSV in einen Stream mit einem mySQL-Ergebnis

function csvFromResult($stream, $result, $showColumnHeaders = true) { 
    if($showColumnHeaders) { 
     $columnHeaders = array(); 
     $nfields = mysql_num_fields($result); 
     for($i = 0; $i < $nfields; $i++) { 
      $field = mysql_fetch_field($result, $i); 
      $columnHeaders[] = $field->name; 
     } 
     fputcsv($stream, $columnHeaders); 
    } 

    $nrows = 0; 
    while($row = mysql_fetch_row($result)) { 
     fputcsv($stream, $row); 
     $nrows++; 
    } 

    return $nrows; 
} 

Dies verwendet die obige Funktion eine CSV in eine Datei, gegeben von $ filename

function csvFileFromResult($filename, $result, $showColumnHeaders = true) { 
    $fp = fopen($filename, 'w'); 
    $rc = csvFromResult($fp, $result, $showColumnHeaders); 
    fclose($fp); 
    return $rc; 
} 

zu schreiben und das ist, wo die Magie passiert;)

function csvToExcelDownloadFromResult($result, $showColumnHeaders = true, $asFilename = 'data.csv') { 
    setExcelContentType(); 
    setDownloadAsHeader($asFilename); 
    return csvFileFromResult('php://output', $result, $showColumnHeaders); 
} 

Zum Beispiel:

$result = mysql_query("SELECT foo, bar, shazbot FROM baz WHERE boo = 'foo'"); 
csvToExcelDownloadFromResult($result); 
+1

Danke John sehr nützlichen Code. Musste eine Zeile für die Funktion csvFromResult ändern. statt while ($ row = mysql_fetch_row ($ ergebnis)) { fputcsv ($ stream, $ row); $ Zeilen ++; } , ich musste while verwenden ($ row = mysql_fetch_row ($ result)) { $ data [] = $ row; // fputcsv ($ stream, $ row); // $ Zeilen ++; } foreach ($ Daten als $ d) { fputcsv ($ Strom, $ d); } . Nochmals vielen Dank für solch einen wundervollen Code. – noobcode

15

Eine Aktualisierung auf @jrgns (mit einigen leichten Syntaxunterschieden) Lösung.

$result = mysql_query('SELECT * FROM `some_table`'); 
if (!$result) die('Couldn\'t fetch records'); 
$num_fields = mysql_num_fields($result); 
$headers = array(); 
for ($i = 0; $i < $num_fields; $i++) 
{  
     $headers[] = mysql_field_name($result , $i); 
} 
$fp = fopen('php://output', 'w'); 
if ($fp && $result) 
{  
     header('Content-Type: text/csv'); 
     header('Content-Disposition: attachment; filename="export.csv"'); 
     header('Pragma: no-cache');  
     header('Expires: 0'); 
     fputcsv($fp, $headers); 
     while ($row = mysql_fetch_row($result)) 
     { 
      fputcsv($fp, array_values($row)); 
     } 
die; 
} 
+0

Aus irgendeinem Grund gibt $ fp false für mich zurück. – Volatil3