4

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

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

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

我的联系表格;

<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\">"; 

这行得通,但在点击提交和被重定向之间我得到了一个丑陋的半秒闪现。

所有的帮助都得到了认可。

谢谢

4

7 回答 7

4

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

删除你所有的echo'es 和print_r's,你应该没问题。

编辑:

同样正如@jhonraymos 提到的,一定要header()正确使用。也许您更改了此设置以隐藏您要重定向到的实际页面。添加具有正确路径定义的本地文件,或者如果重定向到其他域,则需要定义完整的 url。如有疑问,请参阅统一资源定位器。

另一个编辑:

我看到你更新了你的问题。别再尝试印度魔法了,比如

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

只要接受之前不要在屏幕上输出任何东西headers()的事实,你的灵魂就会永远安全。这不是混合 http-meta 的地方。PHP 可以很好地做到这一点。

这听起来可能首先是一个限制,但相信我,它不是。这是一种祝福。

于 2012-10-14T17:22:32.460 回答
4

这是错误

print_r($_POST);

header('Location:mydomain');

您正在打印之前的东西header("location: mydomain.com")

于 2012-10-14T17:23:38.390 回答
4

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

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

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

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

所以这:

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

不应该在此之前:

header('Location:mydomain');
于 2012-10-14T17:32:21.590 回答
3

header 是的,在尝试将其放在页面顶部之前,您不应该回显、打印任何内容:

<?php ob_start(); ?>

然后在页面底部:

<?php ob_end_flush(); ?>
于 2012-10-14T17:28:33.867 回答
2

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

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

于 2012-10-14T17:30:04.753 回答
2

这是php中很常见的问题。一些整理方法:

  1. 在页面顶部使用。

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

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

希望它有所帮助。编码快乐!!

于 2012-10-16T13:16:10.347 回答
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);
于 2012-10-14T17:25:04.913 回答