2008-09-24 12 views
105

Cách hiệu quả nhất để chuyển đổi truy vấn MySQL thành CSV bằng PHP là gì?Mã PHP để chuyển đổi truy vấn MySQL thành CSV

Tốt nhất là nên tránh các tệp tạm thời vì điều này làm giảm tính di động (đường dẫn dir và yêu cầu quyền thiết lập hệ thống tệp).

CSV cũng phải bao gồm một dòng tên trường hàng đầu.

+56

Tại sao câu hỏi này đóng lại không mang tính xây dựng? Điều này là tốt và hoàn toàn rõ ràng. – Mario

+12

@Alec Bởi vì một số người kiểm duyệt ở đây là các nhà siêu âm, bạn biết đấy ... "Với các siêu cường có trách nhiệm lớn!" - Bác Ben – finitenessofinfinity

+16

@finitenessofinfinity bị hỏng, sức mạnh tuyệt đối bị hỏng hoàn toàn. Stackoverflow là một ví dụ tuyệt vời về điều đó. – Mario

Trả lời

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

(tài liệu cho điều này là ở đây: http://dev.mysql.com/doc/refman/5.0/en/select.html)

hay:

$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

về mặt kỹ thuật, đây là tab được phân tách;) –

+5

Lưu ý việc sử dụng dấu gạch chéo chuyển tiếp với 'SELECT INTO OUTFILE' ngay cả trên Windows. – Johan

+1

Hii này hoạt động tốt cho định dạng xls nhưng nếu tôi cố gắng để lưu dưới dạng tệp CSV nó cho thấy tất cả các kết quả trong 1 cột. Tôi muốn lưu tệp này dưới dạng tệp csv. –

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

Nhìn vào số documentation về cú pháp SELECT ... INTO OUTFILE.

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

Check-out question/answer này. Nó ngắn gọn hơn @ Geoff, và cũng sử dụng hàm fputcsv được xây dựng sẵn.

$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

Trân trọng không có tiêu đề cột. –

+0

Tôi đã thêm các tiêu đề cột – Jrgns

+13

Trong trường hợp bất kỳ ai khác ngu ngốc như tôi, không thay thế 'php: // output' bằng tên tệp thực hoặc cố gắng đóng nó bằng' fclose' ở cuối: nó không phải là thực tệp, chỉ là bí danh cho luồng đầu ra. Dù sao câu trả lời này làm việc hoàn hảo cho tôi, cảm ơn Jrgns! –

4

Nếu bạn muốn tải về để được cung cấp như một download có thể được mở trực tiếp trong Excel, điều này có thể làm việc cho bạn: (sao chép từ một dự án chưa được phát hành cũ của tôi)

Những chức năng thiết lập các tiêu đề:

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

một này sẽ gửi một CSV để một dòng bằng cách sử dụng kết quả mysql

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

một này sử dụng hàm trên để viết một CSV vào một tập tin, được đưa ra bởi $ filename

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

Và đây là nơi mà sự kỳ diệu xảy ra;)

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

Ví dụ:

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

Cảm ơn john code rất hữu ích. Đã phải sửa đổi một dòng cho hàm csvFromResult. thay vì trong khi ($ row = mysql_fetch_row ($ result)) { fputcsv ($ stream, $ row); $ hàng ++; } , tôi phải sử dụng trong khi ($ row = mysql_fetch_row ($ result)) { $ data [] = $ row; // fputcsv ($ stream, $ row); // $ rows ++; } foreach ($ data as $ d) { fputcsv ($ stream, $ d); } . cảm ơn một lần nữa cho một mã tuyệt vời như vậy. – noobcode

15

Bản cập nhật cho giải pháp @jrgns (với một số khác biệt cú pháp nhỏ).

$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

Vì lý do nào đó, $ fp trả về false cho tôi. – Volatil3