Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 139
  • Last Modified:

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

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
brucegust
Asked:
brucegust
  • 2
2 Solutions
 
Ray PaseurCommented:
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
 
gr8gonzoConsultantCommented:
Just move the echo on line 37 underneath the last header()
0
 
Ray PaseurCommented:
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
 
Jim RiddlesPrepress/OMS SpecialistCommented:
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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now