1

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 = 'my@email.com';
$subject = "The Vintage Affair Web Quote enquiry";
$comments = "Name: $name \nEmail: $email \nTelephone: $tel \n\nDetails: $comments";
$headers = "From: my@email.com" . PHP_EOL . "Reply-To: my@email.com";

// 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>
4

6 回答 6

2

问题是你在调用 header() 之前输出数据,它不会像这样工作。

将所有 PHP 放在表单上方。

于 2013-07-25T13:37:46.083 回答
1

header()必须在任何输出之前发送,它应该是空格还是字符串。

您必须先检查表单提交,如下所示:

<?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();
}
?>

作为 dispay_form() 一个显示所有 HTML 的函数,可能带有file_get_contents()一个 HTML 文件。

于 2013-07-25T13:39:54.560 回答
1

我遇到了同样的问题,我找到了这个解决方案:

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>';
}

我希望它对你有用

于 2013-07-25T14:11:22.107 回答
0

将表格放在php代码下方

于 2013-07-25T14:26:50.407 回答
0

好的,所以您的问题是您在运行检查之前实际上在屏幕上输出了内容。在您的情况下,在HTML代码的任何输出之前发送标头。

使用ob_start(); ob_end_flush(); 在文件的开头配对,例如

<?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 = 'my@email.com';
        $subject = "The Vintage Affair Web Quote enquiry";
        $comments = "Name: $name \nEmail: $email \nTelephone: $tel \n\nDetails: $comments";
        $headers = "From: my@email.com" . PHP_EOL . "Reply-To: my@email.com";

        // 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(); 在最后

于 2013-07-25T13:51:55.570 回答
0

试试这个也许:

header("Location: thankyou.html");
exit();
于 2013-07-25T13:34:56.203 回答