联系表单PHP重定向不起作用

时间:2012-10-14 17:19:52

标签: php forms email contact

我在联系表单上提交邮件后尝试重定向到我的主页,表单发送电子邮件但收到此消息:

Array
(
    [name] => Abdo
    [company] => Mediabyrån A&B
    [email] => a.el-madhoun@hotmail.com
    [content] => Hejsan
    [contact_to] => info@web.se
)
  

警告:无法修改标头信息 - 已发送的标头   (输出始于   /comersomers/4/5/a/webelite.se/httpd.www/kontakt.php:3)in   第39行/customers/4/5/a/webelite.se/httpd.www/kontakt.php

我的联系表格;

<form action="kontakt.php" method="post">
<p><input type="text" required="required" id="name" name="name" class="text_input" size="22"  />
<label for="name">Namn *</label></p>

<p><input type="text" required="required" id="company" name="company" class="text_input" size="22"  />
<label for="company">Företag *</label></p>

<p><input type="email" required="required" id="email" name="email" class="text_input"  size="22"  />
<label for="email">Epost *</label></p>

<p><textarea required="required" name="content" class="textarea" cols="30" rows="5"></textarea></p>

<p><button type="submit" class="button white"><span>Skicka</span></button></p>
<input type="hidden" value="info@web.se" name="contact_to"/>
</form>

这是我的PHP:

<?php

echo $name = $_POST['name'];
echo $company = $_POST['company'];
echo $email =  $_POST['email'];
echo $content = $_POST['content'];

$mail_to = 'info@webelite.se';
$subject = 'Lilla form'.$name;

$body_message = 'From: '. $name . "\n"; 
$body_message .= 'company: '. $company . "\n";
$body_message .= 'E-mail: '. $email ."\n";
$body_message .= 'Message: '. $content;

$headers = 'From: '. $mail_name . "\r\n";
$headers .= 'Reply-To: '. $email ."\r\n";

$success = mail($mail_to, $subject, $body_message, $headers);

echo "<pre>";
print_r($_POST);

header('Location:mydomain');

?>

我也试过使用if

($success){
print "<meta http-equiv=\"refresh\" content=\"0;URL=YOUR_PAGE_HERE.html\">"; 

这很有效,但在提交和重定向之间我得到了一个丑陋的半秒闪光。

所有帮助都是适当的。

谢谢

7 个答案:

答案 0 :(得分:4)

在重定向之前,您无法向屏幕输出任何内容。

删除所有echoprint_r,你应该没事。

修改

同样@jhonraymos提到,请务必正确使用header()。也许你改了这个来隐藏你重定向的实际页面。要么添加具有正确路径定义的本地文件,要么重定向到其他域,您需要定义完整的URL。如有疑问,请参阅Uniform resource locator

另一个编辑:

我看到你更新了你的问题。停止尝试印度魔术,例如

if ($success){
    print "<meta http-equiv=\"refresh\" content=\"0;URL=YOUR_PAGE_HERE.html\">";

只要接受这样的事实,即不要在headers()之前将 ANYTHING 输出到屏幕,并且你的灵魂永远是安全的。这不是混合使用http-meta的地方.PHP可以做到这一点。

这听起来可能是一个限制,但相信我,事实并非如此。这是一种祝福。

答案 1 :(得分:4)

这是错误

print_r($_POST);

header('Location:mydomain');

您正在header("location: mydomain.com")

之前打印一些内容

答案 2 :(得分:4)

标题用于与客户端的浏览器通信。它们就像浏览器收到时会执行的小命令。当您输出任何数据(文本,数字等)时,您的客户端浏览器将打印该数据。之后,浏览器将不再对您发送的任何标题感兴趣。

header()函数是用于发送自定义标头的函数。因此,当调用此函数时,标题将发送到客户端的浏览器。

现在您对您实际尝试的内容有一个非常简短的了解,您应该能够看到问题所在。

您在发送这些自定义标头之前输出其他数据。这就是触发错误的原因。

所以这个:

echo "<pre>";
print_r($_POST);

不应该在此之前:

header('Location:mydomain');

答案 3 :(得分:3)

是的,你不应该回应,在header之前打印任何东西 尝试将其放在页面顶部:

<?php ob_start(); ?>

然后在页面底部:

<?php ob_end_flush(); ?>

答案 4 :(得分:2)

是什么 echo "<pre>"; print_r($_POST); 是为了?

您的重定向可能在调用任何echo函数之前发生,不是吗?

答案 5 :(得分:2)

这是php中非常常见的问题。一些解决方法:

  1. 在页面顶部使用。

  2. 检查您是否在php open标记之前或php关闭标记之后不小心添加了一些空格。

  3. 如果仍未解决,请使用java-script window.location而不是header。

  4. 希望有所帮助。 快乐的编码!!

答案 6 :(得分:1)

您收到此警告是因为您在屏幕上输出了变量的值,然后在header之后重定向。

标题无法在>打印后发送 echoprint_r ...)。 要修复它,请按照下一个代码:

$name = $_POST['name']; //no echo 
$company = $_POST['company'];//no echo 
$email =  $_POST['email'];//no echo 
$content = $_POST['content'];//no echo 




$mail_to = 'info@webelite.se';
$subject = 'Lilla form'.$name;



$body_message = 'From: '. $name . "\n"; 
$body_message .= 'company: '. $company . "\n";
$body_message .= 'E-mail: '. $email ."\n";
$body_message .= 'Message: '. $content;



$headers = 'From: '. $mail_name . "\r\n";
$headers .= 'Reply-To: '. $email ."\r\n";



$success = mail($mail_to, $subject, $body_message, $headers);



//echo "<pre>";
//print_r($_POST);