【问题标题】:Redirect php form on successful submit成功提交时重定向php表单
【发布时间】:2011-03-06 13:00:27
【问题描述】:

在提交表单的那一刻,使用以下代码:

<?php
if(isset($error))
    {echo "<span id='Warning'>Please enter all areas marked with *</span>";}
else if (isset($sent))
    {echo "<span id='Normal'>Thank you for your enquiry, we will contact you shortly</span>";}
?>

如何在提交时重定向到 THANK YOU 页面(当然如果没有错误)?

表单动作当前是:

<form action="<?php echo $_SERVER['../PHP_SELF']; ?>" method="post" id="enquiryform">

我在执行 sql 查询后尝试了以下操作。我想仅在成功提交表单时将此页面重定向到感谢页面(没有任何错误)

header('Location: THANK YOU PAGE');

我确信这很明显,但我到处搜索并尝试了很多不同的方法,但无济于事!

完整代码(显然删除了服务器信息、电子邮件地址和表单内容,因为它相当长等):

<?php

/* Accessing SQL-Server and querying table */
MYSQL_CONNECT($server, $user, $password) or die ("Server unreachable");
MYSQL_SELECT_DB($database) or die ("Database non existent");

if(array_key_exists('submit',$_POST))
{
$adate = $_POST['adate'];
$guests = $_POST['guests'];
if($guests=="Please Select")
{
$error['guests'] = 'Flagged';
}
$title = $_POST['title'];
if($title=="Please Select")
{
$error['title'] = 'Flagged';
}
$name = trim($_POST['fullname']);
if(empty($name))
{
$error['name'] = 'Flagged';
}
$telephone = trim($_POST['telnumber']);
if(empty($telephone))
{
$error['telephone'] = 'Flagged';
}
$accomm = trim($_POST['accommodation']);
if($accomm=="Default")
{
$error['accommodation'] = 'Flagged';
}   
$email = $_POST['email'];
$pattern = '/^[^@]+@[^\s\r\n\'";,@%]+$/';
if (!preg_match($pattern, trim($email)))
{
$error['email'] = 'Flagged';
}
$message = trim($_POST['message']);

//initialize variables
$to = 'EMAIL@EMAILADDRESS.COM';
$subject = "Enquiry";

 //build the message
$email_message .= 'Arrival Date: '.$adate.' Guests: '.$guests.' Accom: '.$accomm."\n\n";
$email_message .= 'Name: '.$title.' '.$name."\n\n";
$email_message .= 'Telephone: '.$telephone."\n\n";
$email_message .= 'Email: '.$email."\n\n";
$email_message .= 'Message: '.$message;

$additionalHeaders = "From: XXXXXXXXXXXX<".$email.">";
//print_r($error);
//send the email

if (!isset($error))
{
     mail($to, $subject, $email_message, $additionalHeaders);

MYSQL_QUERY("INSERT into Enquiry VALUES('".date('d/m/y')."','".$_POST['hSpa']."','".$_POST['hPackage']."','".$adate."','".$guests."','".$accomm."','".$title."','".$name."','".$telephone."','".$email."','".$message."')");
}
}
?>
</head>

<body id="body">

    <form action="<?php echo $_SERVER['../PHP_SELF']; ?>" method="post"    id="enquiryform">

            <p>Areas marked with * must be completed</p>

                <label class="enquiryform" id="message" for="message">Message</label>
              <textarea name="message" id="message" rows="9" cols="55" tabindex="9" onclick="removeDefaultText(this)"><?php if(isset($error)) {echo $message;} else {echo "Please use this area for any other information about your enquiry";}?></textarea>

        <input type="submit" id="submit" name="submit" value="Send enquiry" tabindex="10" />

</form>
</div>

<?php
if(isset($error)) {
echo "<span id='Warning'>Please enter all areas marked with *</span>";
}
else if (isset($sent)) {
header("Location: THANK YOU PAGE.HTML");
exit();
}
?>  
</div>  

【问题讨论】:

  • 正确,这是怎么回事?
  • 正确的用法是:"../".$_SERVER['PHP_SELF']
  • 感谢@Lucius - 它按原样工作,所以也许我不需要更改它?!不过感谢您的评论
  • 表单的“action”属性的输出是什么?如果它是空的(就像我怀疑的那样),表单会自动将其数据发送到自己的页面..
  • 另外,请注意header函数只有在调用之前没有发送其他输出时才会起作用,否则会抛出致命错误,这就是我设置的原因我的回答中的那个功能,静音header并退回到javascript重定向(你也可以使用元刷新)以防万一失败..

标签: php redirect


【解决方案1】:

你可以这样设置一个函数:

function pageRedirect ($page) {
    if (!@header("Location: ".$page))
       echo "\n<script type=\"text/javascript\">window.location.replace('$page');</script>\n";
    exit;
}

然后像这样在你的代码中使用它:

<?php
if(isset($error))
    echo "<span id='Warning'>Please enter all areas marked with *</span>";
else 
    pageRedirect ($thankyoupage);
?>

然后你可以把所有的thankyous ant the blahblah放在thankyou页面中

【讨论】:

    【解决方案2】:

    添加

    exit(); 
    

    在标头调用之后。

    <?php
    if(isset($error)) {
        echo "<span id='Warning'>Please enter all areas marked with *</span>";
    }
    else {
        header("Location : thank you page");
        exit();
    }
    ?>
    

    【讨论】:

    • 你有没有把 header 指令放在你的 elseif (isset($sent)) {} 语句中?
    • @Motley9735 标头调用和退出应该在你的 else if 代码中
    • No Ben - php 错误/感谢指令与标头指令是分开的。两者应该在一起吗?这看起来如何?
    • Emaillenin - 再次感谢。这看起来如何? 请输入所有标有*的区域";} else if (isset($sent)) header('Location:谢谢你页');出口(); ?> 非常感谢你们——我相信你们会说,我对这一切都很陌生,并且慢慢地学习我的方式!
    • @Motley: 能否调试一下代码是否通过else子句运行?
    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多