Reputation: 1388
I've seen this asked before and I am having trouble getting this to work properly after trying a number of solutions. The problem is I can't get my data to export into a csv format properly. Before I added my ob_end_clean it would export out to a csv with html, now it doesn't give me a csv, just text.
Here is my code on the file that is being required.
if (isset($_POST["hidden"])) {
$list = array (
array('aaa', 'bbb', 'ccc', 'dddd'),
array('123', '456', '789'),
array('"aaa"', '"bbb"')
);
$fp = fopen('php://output','w');
foreach ($list as $row) {
ob_end_clean();
fputcsv($fp, $row);
}
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');
}
Right now when I do my export, the data gets put back on the screen similar to a var_dump(). I just simply want this to go to a csv file without having html all over it.
Upvotes: 2
Views: 25134
Reputation: 2472
The logic for it to work is to construct your php script so that it:
echo "<html...>;"
(this already uses php's output buffer behind the scenes)ob_end_clean()
(depending how ob_start() was called this may prevent the previous export) or ob_clean()
which just sends content so far to the browser and cleans the buffer without turning it off.Upvotes: 2
Reputation: 355
Place, ob_end_clean(); before you output the csv.
ob_end_clean() meaning: "Clean (erase) the output buffer and turn off output buffering" - PHP manual.
Upvotes: 5
Reputation: 1388
Got it working!
I invoked my csv code before anything on the page. :) Then I did my connection to my table, then did my logic for my code. I didn't have an ob_start or ob_flush on my main file which made a big difference. I had the ob_clean before the while loop and then I did an exit() after declaring the header. Hopefully, this explains it well.
Here is my code.
if (isset($_POST["hidden"])) {
$sql = "SELECT * FROM `newsletter`";
$result = mysql_query($sql);
ob_end_clean();
$fp = fopen('php://output','w');
while ($list = mysql_fetch_assoc($result)) {
fputcsv($fp, $list);
}
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');
exit();
}
Upvotes: 22