Create a CSV File for a user in PHP

Viewed 388633

I have data in a MySQL database. I am sending the user a URL to get their data out as a CSV file.

I have the e-mailing of the link, MySQL query, etc. covered.

How can I, when they click the link, have a pop-up to download a CVS with the record from MySQL?

I have all the information to get the record already. I just don't see how to have PHP create the CSV file and let them download a file with a .csv extension.

20 Answers

Try:

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

echo "record1,record2,record3\n";
die;

etc

Edit: Here's a snippet of code I use to optionally encode CSV fields:

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

Create your file then return a reference to it with the correct header to trigger the Save As - edit the following as needed. Put your CSV data into $csvdata.

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

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

Simple method -

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

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

So each line of the $data array will go to a new line of your newly created CSV file. It only works only for PHP 5 and later.

To have it send it as a CSV and have it give the file name, use header():

http://us2.php.net/header

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

As far as making the CSV itself, you would just loop through the result set, formatting the output and sending it, just like you would any other content.

<?
    // Connect to database
    $result = mysql_query("select id
    from tablename
    where shid=3");
    list($DBshid) = mysql_fetch_row($result);

    /***********************************
    Write date to CSV file
    ***********************************/

    $_file = 'show.csv';
    $_fp = @fopen( $_file, 'wb' );

    $result = mysql_query("select name,compname,job_title,email_add,phone,url from UserTables where id=3");

    while (list( $Username, $Useremail_add, $Userphone, $Userurl) = mysql_fetch_row($result))
    {
        $_csv_data = $Username.','.$Useremail_add.','.$Userphone.','.$Userurl . "\n";
        @fwrite( $_fp, $_csv_data);
    }
    @fclose( $_fp );
?>

public function actionExportnotificationresponselogdata() {

    $fileName = '/tmp/notificationresponselogs_' . date('d-m-Y-g-i-h') . '.csv';
    $f = fopen($fileName, 'w'); 
     fputs( $f, "\xEF\xBB\xBF" ); //for utf8 support in csv



        $csv_fields=array();
        $csv_fields[] = 'heading1';
        $csv_fields[] = 'heading2';
        $csv_fields[] = 'heading3';
        $csv_fields[] = 'heading4';
        $csv_fields[] = 'heading5';
        $csv_fields[] = 'heading6';
        $csv_fields[] = 'heading7';
        $csv_fields[] = 'heading8';
        fputcsv($f, $csv_fields);

    
$notification_log_arr = $notificationObj->getNotificationResponseForExport($params); //result from database

    if (count($notification_log_arr) > 0) {
        $serialNumber=1;
    foreach ($notification_log_arr AS $notifaction) {
            

            $fields = array();
            $fields['serialNumber']= $serialNumber  ;
            $fields['fld_1']= $notifaction['fld_1'] ;
            $fields['fld_2']= $notifaction['fld_2'] ;
            $fields['fld_3']= $notifaction['fld_3'] ;
            $fields['fld_4']= $notifaction['fld_4'] ;
            $fields['fld_5']= $notifaction['fld_5'] ;
            $fields['fld_6']= $notifaction['fld_6'] ; 
            $fields['fld_7']= $notifaction['fld_7'] ; 
           // print_r($fields); die;
            fputcsv($f, $fields,",");
        
            $serialNumber++;  }
            fclose($f);
            if (file_exists($fileName)) {
                
                header("Content-type: application/csv");
                header("Content-Disposition: attachment; filename="."exportlog".date("Y-m-d_H:i").".csv");
                header("Content-length: " . filesize($fileName));
                header("Pragma: no-cache"); 
                header("Expires: 0");
                readfile($fileName);
                unlink($fileName);
                exit;
            }
}
Related