복붙노트

MySQL의 쿼리를 CSV로 변환하는 PHP 코드 [닫기]

PHP

MySQL의 쿼리를 CSV로 변환하는 PHP 코드 [닫기]

PHP에서 MySQL 쿼리를 CSV로 변환하는 가장 효율적인 방법은 무엇입니까?

임시 파일은 이식성을 떨어 뜨리기 때문에 (dir 경로 및 필요한 파일 시스템 사용 권한 설정 필요) 피하는 것이 가장 좋습니다.

CSV에는 필드 이름의 최상위 행 하나가 포함되어야합니다.

해결법

  1. ==============================

    1.

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

    (이에 대한 문서는 http://dev.mysql.com/doc/refman/5.0/en/select.html)

    또는:

    $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";
    
  2. ==============================

    2.이 질문 / 답변을 확인하십시오. @ Geoff보다 더 간결하며 내장 된 fputcsv 함수도 사용합니다.

    이 질문 / 답변을 확인하십시오. @ Geoff보다 더 간결하며 내장 된 fputcsv 함수도 사용합니다.

    $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;
    }
    
  3. ==============================

    3.SELECT ... INTO OUTFILE 구문과 관련된 설명서를 참조하십시오.

    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;
    
  4. ==============================

    4.@ 약간의 구문 차이가있는 @jrgns에 대한 업데이트입니다.

    @ 약간의 구문 차이가있는 @jrgns에 대한 업데이트입니다.

    $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; 
    } 
    
  5. ==============================

    5.다운로드 파일을 Excel에서 직접 열 수있는 다운로드 파일로 제공하려면이 방법이 유용 할 수 있습니다. (출시되지 않은 이전 프로젝트에서 복사)

    다운로드 파일을 Excel에서 직접 열 수있는 다운로드 파일로 제공하려면이 방법이 유용 할 수 있습니다. (출시되지 않은 이전 프로젝트에서 복사)

    이 함수는 헤더를 설정합니다.

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

    이 하나는 mysql 결과를 사용하여 스트림으로 CSV를 보냅니다.

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

    이 함수는 위의 함수를 사용하여 $ filename에 지정된 파일에 CSV를 씁니다.

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

    그리고 이것이 마술이 일어나는 곳입니다.)

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

    예 :

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

    6.

    // 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;
    }
    
  7. from https://stackoverflow.com/questions/125113/php-code-to-convert-a-mysql-query-to-csv by cc-by-sa and MIT license