PHP bir kullanıcı için bir CSV dosyası oluştur

16 Cevap php

Ben bir MySQL veritabanı veri var. Ben bir CSV dosyası olarak onların verilerini almak için kullanıcıya bir URL yolluyorum.

Ben vs bağlantı, MySQL sorgu, e-posta örtülü var.

Nasıl onlar bağlantıyı tıkladığınızda, MySQL kaydı ile bir CVS indirmek için bir pop-up olabilir?

Zaten kaydını almak için tüm bilgilere sahip. Ben sadece PHP CSV dosyasını oluşturmak ve onları bir. Csv uzantılı bir dosya indirmek izin nasıl görmüyorum.

16 Cevap

Deneyin:

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

echo "record1,record2,record3\n";

vb

Düzenleme: İşte kodlamak CSV alanlarını isteğe bağlı olarak kullanabileceğiniz bir kod parçacığı var:

function maybeEncodeCSVField($string) {
    if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {
        $string = '"' . str_replace('"', '""', $string) . '"';
    }
    return $string;
}

İşte Andrew @ yayınlanmıştır php.net gelen işlevinin geliştirilmiş bir versiyonu.

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", "w");

    foreach($results as $result)
    {
        fputcsv($outstream, $result);
    }

    fclose($outstream);
}

Kullanımı gerçekten çok kolay ve MySQL (i) / PDO sonuç setleri ile harika çalışıyor.

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

Eğer sayfa ile yapılır eğer bu çağırdıktan sonra exit() unutmayın.

Iplik Biliyorum, biraz eski, ama ileride kendim gibi acemi için:

Herkes burada CSV oluşturmak için nasıl açıklamak, ancak sorunun temel bir bölümünü kaçırmayın: bağlantı nasıl. CSV dosyasının indirmek için bağlantı için, sadece sırayla bir. Csv dosyası olarak yanıt. Php dosyası, link. PHP başlıkları bunu. Bu sorgu dizesi değişkenleri ekleme ve çıktı özelleştirmek gibi, güzel şeyler sağlar:

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

my_csv_creator.php sorgu dizesi verilen ve örneğin böylece, örneğin, farklı veya özelleştirilmiş veritabanı sorgularını kullanabilirsiniz CSV sütunları değiştirmek, dosya kişiselleştirmek ve değişkenleri ile çalışabilirsiniz:

User_John_Doe_10_Dec_11.csv

Dosyanızı oluşturun sonra Farklı Kaydet tetiklemek için doğru başlığı ile kendisine bir başvuru döndürmek - gerektiği gibi takip düzenleyin. $ Csvdata içine CSV veri koymak.

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

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

İlk sınırlayıcı (ile ayrılmış ",") olarak virgül ile bir dize gibi verileri yapmak. Böyle bir şey

$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);
*/

Zaten dedi Tüm bunlara ek olarak, eklemek gerekebilir:

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

Birden çok dil tutarken insanların isimlerini veya şehirler gibi, çok kullanışlı.

Basit bir yöntem -

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

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

Yani $data dizisinin her satırı yeni oluşturulan CSV dosyasının yeni bir satıra gidecek. Bu yalnızca PHP 5 ve sonrası için çalışıyor.

Hey Bu .... çok iyi çalışıyor!! Teşekkürler Peter Mortensen ve 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;
}

>

İşte PDO kullanarak ve sütun başlıkları dahil olmak üzere tam bir çalışma örneği:

$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", "w");    
    fputcsv($outstream, array_keys($results[0]));

    foreach($results as $result)
    {
        fputcsv($outstream, $result);
    }

    fclose($outstream);
}

Kolay yolu bu gibi özel bir CSV class kullanmaktır:

$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'); 

Yerine:

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

Kullanın:

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

O) bir CSV olarak göndermek ve dosya adı, kullanım başlığı (vermek zorunda var:

http://us2.php.net/header

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

Bildiğim kadarıyla, sonuç kümesi üzerinden CSV kendisi, yapacağınız sadece döngü yapma biçimlendirme çıkışı ve gönderme, sadece herhangi bir başka içerik yaptığınız gibi.

Bu çok kolay yapacak ...

Create .CSV Files From PHP

İstediğiniz gibi kullanıcıya dosyayı ister.

Burada belirli tarihler arasında veri kapma, daha önce yapmış biridir. Umarım yardımcı olur.

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

Zaten çok iyi bir çözüm geldi. Bir acemi toplam yardım almak böylece ben sadece toplam kodunu puting ediyorum

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

?>

Ben csv-download.php Bu kodu kaydettiğiniz

Şimdi csv dosyasını indirmek için bu verileri nasıl kullandıklarını görmek

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

Bu yüzden tarayıcıda csv-download.php sayfa beni almadan dosyayı karşıdan linki tıkladığında.

$output değişkene CSV veri koymak ve doğru başlıkları ile echo

header("Content-type: application/download\r\n");
header("Content-disposition: filename=filename.csv\r\n\r\n");
header("Content-Transfer-Encoding: ASCII\r\n");
header("Content-length: ".strlen($output)."\r\n");
echo $output;