Creating csv file with php

PhpCsv

Php Problem Overview


I want to create a csv file, but when I run the code, it returns a blank page and no csv file. I use PHP 5. I use the following code:

<?php
    $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);
?>

Thank you!

Php Solutions


Solution 1 - Php

Its blank because you are writing to file. you should write to output using php://output instead and also send header information to indicate that it's csv.

Example

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="sample.csv"');
$data = array(
		'aaa,bbb,ccc,dddd',
		'123,456,789',
		'"aaa","bbb"'
);

$fp = fopen('php://output', 'wb');
foreach ( $data as $line ) {
	$val = explode(",", $line);
	fputcsv($fp, $val);
}
fclose($fp);

Solution 2 - Php

@Baba's answer is great. But you don't need to use explode because fputcsv takes an array as a parameter

For instance, if you have a three columns, four lines document, here's a more straight version:

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="sample.csv"');

$user_CSV[0] = array('first_name', 'last_name', 'age');

// very simple to increment with i++ if looping through a database result 
$user_CSV[1] = array('Quentin', 'Del Viento', 34);
$user_CSV[2] = array('Antoine', 'Del Torro', 55);
$user_CSV[3] = array('Arthur', 'Vincente', 15);

$fp = fopen('php://output', 'wb');
foreach ($user_CSV as $line) {
    // though CSV stands for "comma separated value"
    // in many countries (including France) separator is ";"
    fputcsv($fp, $line, ',');
}
fclose($fp);

Solution 3 - Php

Just in case if someone is wondering to save the CSV file to a specific path for email attachments. Then it can be done as follows

> I know I have added a lot of comments just for newbies :)

I have added an example so that you can summarize well.

$activeUsers = /** Query to get the active users */

/** Following is the Variable to store the Users data as 
    CSV string with newline character delimiter, 
    
    its good idea of check the delimiter based on operating system */

$userCSVData = "Name,Email,CreatedAt\n";

/** Looping the users and appending to my earlier csv data variable */
foreach ( $activeUsers as $user ) {
    $userCSVData .= $user->name. "," . $user->email. "," . $user->created_at."\n";
}
/** Here you can use with H:i:s too. But I really dont care of my old file  */
$todayDate  = date('Y-m-d');
/** Create Filname and Path to Store */
$fileName   = 'Active Users '.$todayDate.'.csv';
$filePath   = public_path('uploads/'.$fileName); //I am using laravel helper, in case if your not using laravel then just add absolute or relative path as per your requirements and path to store the file

/** Just in case if I run the script multiple time 
    I want to remove the old file and add new file.
    
    And before deleting the file from the location I am making sure it exists */
if(file_exists($filePath)){
    unlink($filePath);
}
$fp = fopen($filePath, 'w+');
fwrite($fp, $userCSVData); /** Once the data is written it will be saved in the path given */
fclose($fp);

/** Now you can send email with attachments from the $filePath */

> NOTE: The following is a very bad idea to increase the > memory_limit and time limit, but I have only added to make sure if anyone faces the problem of connection time out or any other. > Make sure to find out some alternative before sticking to it.

You have to add the following at the start of the above script.

ini_set("memory_limit", "10056M");
set_time_limit(0);
ini_set('mysql.connect_timeout', '0');
ini_set('max_execution_time', '0');

Solution 4 - Php

In case someone is still looking for an answer (a simple one), here is the simple way of creating a csv with PHP.

//your data titles (your csv's heading titles)
$data = "TITLE 1, TITLE 2, TITLE 3 \n";

and you want to run some loop to add more data to it, let say a foreach loop

foreach(condition){
  $data .= val1 .",". val2 .",". val3 \n ;
}
$fileName   = 'your_file_name.csv';
$filePath   = ('your_path_to'.$fileName);
//you can use **$_SERVER['DOCUMENT_ROOT']** in your file path. Avoid using absoultue paths like **../**

$fp = fopen($filePath, 'w+');
fwrite($fp, print_r($data, true)); 
//Once the data is written it will be saved in the path given
fclose($fp);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionandrei.godeaView Question on Stackoverflow
Solution 1 - PhpBabaView Answer on Stackoverflow
Solution 2 - PhpBuzutView Answer on Stackoverflow
Solution 3 - PhpChannaveer HakariView Answer on Stackoverflow
Solution 4 - Phpomair munirView Answer on Stackoverflow