tags:

views:

66

answers:

3

I have a header location problem despite following all the advice I can find online. The mailer script sends the email(s) but I get a 'headers already sent' error relating to Line 29 which is {header("Location: $thanksURL");} and no redirect to the confirmation page. If I replace the header location code with an instruction to print a confirmatory message instead, it works, so there must be something about the header location code that the server doesn't like.

Here is the code:

<?php
ob_start(); 
$to = "[email protected]" ; 
$from = $_REQUEST['email'] ; 
$name = $_REQUEST['name'] ; 
$headers = "From: $from"; 
$subject = "Request for Library Document"; 
$thanksURL = "http://www.postalhistory.org.uk/newsite/php/thankyou.php"; //confirmation page
$fields = array(); 
$fields{"name"} = "Name"; 
$fields{"address"} = "Address"; 
$fields{"email"} = "Email"; 
$fields{"tel"} = "Telephone No"; 
$fields{"author1"} = "First Author"; 
$fields{"title1"} = "First Title"; 
$fields{"author2"} = "Second Author"; 
$fields{"title2"} = "Second Title"; 
$body = "I would like to borrow the undermentioned book(s) from the PHS Library:\n\n"; foreach($fields as $a => $b){    $body .= sprintf("%20s: %s\n",$b,$_REQUEST[$a]); } 
$headers2 = "From: The Librarian, Postal History Society"; 
$subject2 = "Thank you for contacting the Postal History Society"; 
$autoreply = "Thank you for your request. Somebody will get back to you as soon as possible, usually within 48 hours.";
if($from == '') {print "You have not entered an email, please go back and try again";} 
else { 
if($name == '') {print "You have not entered a name, please go back and try again";} 
else { 
$send = mail($to, $subject, $body, $headers); 
$send2 = mail($from, $subject2, $autoreply, $headers2); 
if($send) 
{header("Location: $thanksURL");} 
else 
{print "We encountered an error sending your mail, please notify [email protected]"; } 
}
}
ob_end_flush()
?>

Go to http://www.postalhistory.org.uk/newsite/php/library.php to try it out for yourself.

Can anyone suggest what is wrong?

Mike

+1  A: 

'headers already sent' means you've already sent something to the browser. This could be a whitespace somewhere. It could also be that your file is encoded in UTF-8 with BOM which means you've sent the BOM to the browser

Manos Dilaverakis
A: 

Warning: Cannot modify header information - headers already sent by (output started at /home/users/uks52804/html/postalhistory.org.uk/newsite/php/contact.php:1) in /home/users/uks52804/html/postalhistory.org.uk/newsite/php/contact.php on line 29

This means that you have output prior to your ob_start() call. ob_start should be the first instruction of the page that is including that code.

HoLyVieR
I've double checked all whitespace issues and there definitely is none. Also, how do you explain that the script works if you replace the header location redirect with an instruction to print a message?
Mike
A: 

I faced the same problem a while back and found that i was echoing something before setting the headers. I removed the echo statement and also cleared some whitespaces that removed the problem

sushil bharwani