Solved

I've got things out of sequence here. What needs to change?

Posted on 2014-09-25
4
111 Views
Last Modified: 2014-09-29
I'm generating a csv file and when it finishes, I'm getting an error that reads:

Cannot modify header information - headers already sent by (output started at C:\wamp\www\json\csv_test.php:37) in C:\wamp\www\json\csv_test.php on line 40

Which makes total sense since I'm echoing the output just before that.

But how do I get it to the actual csv file. Stupid question, but there it is....

Here's my code:

<?php 
ini_set("memory_limit","500M");
error_reporting(E_ALL);

set_time_limit(600);
include ("carter.inc");
$cxn = mysqli_connect($host,$user,$password,$database)
or die ("couldn't connect to server");

$output="";

$michelle="select * from verizon order by id";
$michelle_query=mysqli_query($cxn, $michelle)
or die("Michelle didn't work");
$michelle_columns=mysqli_field_count($cxn);

//gets the field names from your table and sets them up as the first row in your csv file

$heading=mysqli_fetch_fields($michelle_query);

foreach ($heading as $val)
{
	$output .='"'.$val->name .'",';
}
$output .="\n";


while($michelle_row=mysqli_fetch_array($michelle_query))
{
	for($i=0; $i<$michelle_columns; $i++)
	{
		$output .='"'.$michelle_row["$i"].'",';
	}
$output .="\n";
}

echo $output;

$filename="json.csv";
header('Content-type:appliation/csv');
header('Content-Disposition: attachment; filename='.$filename);

?>

Open in new window

0
Comment
Question by:brucegust
  • 2
4 Comments
 
LVL 108

Accepted Solution

by:
Ray Paseur earned 250 total points
Comment Utility
You probably want to modify the flow of the script's logic to send the headers before any of the output.  Maybe something like this.  Sorry I cannot test this because i do not have your data set.

set_time_limit(600);
include ("carter.inc");
$cxn = mysqli_connect($host,$user,$password,$database)
or die ("couldn't connect to server");

$output="";

$michelle="select * from verizon_test order by id";
$michelle_query=mysqli_query($cxn, $michelle)
or die("Michelle didn't work");
$michelle_columns=mysqli_field_count($cxn);

$filename="json.csv";

// OPEN THE CSV FILE HERE
$file = fopen($filename, 'w');

// GET THE FIELD NAMES
$heading=mysqli_fetch_fields($michelle_query);
fputcsv($file, $heading);

// GET THE DATA SET
while($michelle_row=mysqli_fetch_assoc($michelle_query))
{
    fputcsv($file, $michelle_row);
}

// REWIND THE CSV FILE HERE
rewind($file);

// SEND HEADERS AND DATA
header('Content-type:application/csv');
header('Content-Disposition: attachment; filename='.$filename);

fpassthru($file);

Open in new window

0
 
LVL 34

Assisted Solution

by:gr8gonzo
gr8gonzo earned 250 total points
Comment Utility
Just move the echo on line 37 underneath the last header()
0
 
LVL 108

Expert Comment

by:Ray Paseur
Comment Utility
Also, one of the core habits of successful software developers is reading the fine manuals.  For example, look up the PHP man page for this function: mysqli_fetch_array()
http://php.net/manual/en/mysqli-result.fetch-array.php

Once you have read that man page, if you do not understand why you should not be using that function here, please post back and we can try to help.  But I think you will agree that it is obvious that mysqli_fetch_array() returns twice as much data as you want!
0
 
LVL 4

Expert Comment

by:Jim Riddles
Comment Utility
You also have a typo on line 40 of your code, which Ray already corrected in his example.  I just wanted to point it out for you.

header('Content-type:appliation/csv');

header('Content-type:application/csv');

Open in new window


Note the missing "c" in application.
0

Featured Post

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

Consider the following scenario: You are working on a website and make something great - something that lets the server work with information submitted by your users. This could be anything, from a simple guestbook to a e-Money solution. But what…
Since pre-biblical times, humans have sought ways to keep secrets, and share the secrets selectively.  This article explores the ways PHP can be used to hide and encrypt information.
The viewer will learn how to dynamically set the form action using jQuery.
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now