Reputation: 25
I've created a form with the following html and php code, and basically it runs a check to see if the spam question has been completed successfully in which case it should process the form, send an email through and redirect the user to the thankyou.html page. However at the moment, on success, the form just reloads the same page and doesn't redirect to the thank you page, however I do receive a confirmation email...
Is there something I've missed off/got wrong in the code below to stop this from actioning?
<form id="form" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table>
<tr>
<td align="right"><label for="name">Name:<span class="error"><?php echo $nameErr;?></span></label></td>
<td><input type="text" name="name" id="name" /></td>
</tr>
<tr>
<td align="right"><label for="email">Email:<span class="error"><?php echo $emailErr;?></span></label></td>
<td><input type="text" name="email" id="email" /></td>
</tr>
<tr>
<td align="right"><label for="telephone">Telephone:<span class="error"><?php echo $telErr;?></span></label></td>
<td><input name="telephone" type="text" id="telephone" /></td>
</tr>
<tr>
<td align="right"><label for="field">Anti-spam question:<span class="error"><?php echo $spamErr;?></span></label></td>
<td><input name="field" type="text" id="field" value="Complete the Beatles lyric: all you need is...?" onfocus="if(this.value==this.defaultValue) this.value='';" onblur="if(this.value == ''){this.value='Complete the Beatles lyric: all you need is...?';}" /></td>
</tr>
<tr>
<td align="right"><label for="message">Message:</label></td>
<td><textarea name="message"></textarea></td>
</tr>
<tr>
<td colspan="2" align="right"><img src="images/contactdots.gif" width="338" height="10" alt="" /></td>
</tr>
<tr>
<td colspan="2" align="right"><input id="button" type="Submit" value="SUBMIT" alt="submit" /></td>
</tr>
</table>
<?php
if($_SERVER['REQUEST_METHOD'] == "POST"){
// Pick up the form data and assign it to variables
$name = stripslashes($_POST['name']);
$email = stripslashes($_POST['email']);
$tel = $_POST['telephone'];
$comments = stripslashes($_POST['message']);
$field = strtolower($_POST['field']);
$spam_check = 'love';
if($field == $spam_check){
// Build the email (replace the address in the $to section with your own)
$to = '[email protected]';
$subject = "The Vintage Affair Web Quote enquiry";
$comments = "Name: $name \nEmail: $email \nTelephone: $tel \n\nDetails: $comments";
$headers = "From: [email protected]" . PHP_EOL . "Reply-To: [email protected]";
// Send the mail using PHPs mail() function
mail($to, $subject, $comments, $headers);
// Redirect
header("Location: thankyou.html");
}
else{ echo '<div class="spam">*You got the Beatle\'s lyric wrong, please try again*</div>'; }
}
?>
</form>
Upvotes: 1
Views: 367
Reputation: 26
I have met the same problem and I've found this solution :
if (!headers_sent()){
header('Location: thankyou.html');
}
else {
echo '<script>';
echo 'window.location.href="thankyou.html";';
echo '</script>';
echo '<noscript>';
echo '<meta http-equiv="refresh" content="0; url=thankyou.html" />';
echo '</noscript>';
}
I hope that it Will be useful for you
Upvotes: 1
Reputation: 625
Ok so your problem is that you actually output stuff on the screen before you run your checks. Headers are sent right before any output in your case the HTML code.
Use ob_start(); ob_end_flush(); pair at the beginning of the file something like
<?php
ob_start(); // this stores the output in a buffer for later use
?>
html code here
<?php
if($_SERVER['REQUEST_METHOD'] == "POST"){
// Pick up the form data and assign it to variables
$name = stripslashes($_POST['name']);
$email = stripslashes($_POST['email']);
$tel = $_POST['telephone'];
$comments = stripslashes($_POST['message']);
$field = strtolower($_POST['field']);
$spam_check = 'love';
if($field == $spam_check){
// Build the email (replace the address in the $to section with your own)
$to = '[email protected]';
$subject = "The Vintage Affair Web Quote enquiry";
$comments = "Name: $name \nEmail: $email \nTelephone: $tel \n\nDetails: $comments";
$headers = "From: [email protected]" . PHP_EOL . "Reply-To: [email protected]";
// Send the mail using PHPs mail() function
mail($to, $subject, $comments, $headers);
// Redirect
header("Location: thankyou.html");
}
else echo '<div class="spam">*You got the Beatle\'s lyric wrong, please try again*</div>';
}
ob_end_flush(); // this is for printing the buffered output
?>
ob_end_flush(); at the end
Upvotes: 0
Reputation: 5961
header()
must be sent before ANY output, should it be a space or a string.
You must check the form submission before, like this:
<?php
if( isset($_POST['myform'] )
{
if( spam_check($_POST['myform']) === true )
{
header("Location: thankyou.html");
}
else
{
echo '<div class="spam">*You got the Beatle\'s lyric wrong, please try again*</div>';
}
}
else
{
display_form();
}
?>
Being dispay_form() a function that displays all the HTML, maybe with a file_get_contents()
of a HTML file.
Upvotes: 1
Reputation: 4161
The problem is you're outputting data before calling the header(), it won't work like this.
Put all the PHP above the form.
Upvotes: 2