CSV için bir MySQL sorgu dönüştürmek için PHP kodu [kapalı]

6 Cevap php

PHP CSV bir MySQL sorgusu lütfen dönüştürmek için en etkili yolu nedir?

Bu taşınabilirlik (gerekli dir yolları ve ayar dosya sistemi izinleri) azaltır gibi geçici dosyaları önlemek için iyi olacaktır.

CSV de alan isimlerden biri üst satır içermelidir.

6 Cevap

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

(the documentation for this is here: http://dev.mysql.com/doc/refman/5.0/en/select.html )

veya:

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

Bu kontrol question / answer. Bu Geoff @ daha özlü, ve aynı zamanda yerleşik fputcsv fonksiyonunu kullanır.

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

OUTFILE sözdizimi INTO ... SELECT ilgili documentation bak.

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

Solüsyonu (bazı hafif sözdizimi farklılıklar ile) @ jrgns için bir güncelleştirme.

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

Eğer indirme doğrudan Excel'de açılabilir bir indirme olarak sunulacak istiyorsanız, bu sizin için çalışabilir: (benim eski bir yayımlanmamış projeden kopyalanan)

Bu işlevler kurulum başlıkları:

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

Bu bir mysql sonuç kullanarak bir akıma CSV gönderir

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

Bu bir $ dosya tarafından verilen, bir dosyaya bir CSV yazmak için yukarıdaki işlevini kullanır

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

Sihirli olur nerede Ve bu ;)

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

Örneğin:

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

By the way, I realise I am replying about a year late to RonP's question, but it has not been answered yet, and others who found this page via Google, like me, may appreciate an answer.

Ayrı bir hat üzerinde her $row çıktısını istiyorsanız RonP sorusuna cevap olarak, Eğer bir yerde satır sonları eklemek gerekir. Bellekten Ben bu iki seçenekten biri olduğunu düşünüyorum:

\n veya \r\n

Karışıklık nedeni \ r \ n pencerelerin üzerinde çalışmak gerektiğini, ancak linux satır sonları biraz farklı, ve ben o \ n olduğunu tahmin ediyorum, ama yanlış olabilir. google! :)

** Düzenleme: linebreaks hakkında daha fazla bilgi için bu bakınız: PHP Echo Line Breaks

Kısaca koduna bakarak, sen csvFromResult(): aşağıdaki satırı değiştirmeniz gerekir

fputcsv($stream, $row);

ile:

fputcsv($stream, $row."\r\n");

Yanılıyorsam beni düzeltin lütfen :)