联系表单 PHP 重定向无效。

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.se/httpd.www/kontakt.php:3),位于 /customers/4/5/a/webelite.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\">"; 

这样做是有效的,但我在提交后被重定向之前会看到一个难看的半秒闪烁。
非常感谢任何帮助。
谢谢。
7个回答

4
在重定向之前,您无法将任何内容输出到屏幕。
删除所有的echoprint_r,然后问题就会解决。
另外,如@jhonraymos所提到的,请确保正确使用header()。也许您更改了这个以隐藏您实际要重定向到的页面。要么添加一个具有正确路径定义的本地文件,要么如果重定向到其他域,则需要定义完整的URL。如果有疑问,请参见统一资源定位符
我看到您更新了您的问题。停止尝试印度魔法,例如

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

接受事实,即在 headers()之前不要向屏幕输出任何内容,你的灵魂就永远安全了。这不是混合http元数据的地方。PHP可以很好地完成这项工作。

起初这可能听起来像是一种限制,但相信我,它是一种福音。


所以我的 PHP 代码中首先是头部,然后移除 echo 输出语句? - Abel
标题实际上可以保持原样。只是在调用 header() 之前不要向屏幕输出任何内容。 - BudwiseЯ

4

这是一个错误。

print_r($_POST);

header('Location:mydomain');

header("location: mydomain.com") 之前,您正在打印某些内容。


4

头部信息用于与客户端浏览器通信。它们像是浏览器接收到时将执行的小命令。当你输出任何数据(文本、数字或其他),你的客户端浏览器将打印出这些数据。之后,浏览器将不再对您发送的任何标头感兴趣。

header()函数是一个用于发送自定义标头的函数。所以当调用此函数时,标头将被发送到您的客户端浏览器。

现在您已经对您实际尝试做什么有了非常简要的了解,您应该能够看到问题所在。

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

所以正确的代码应该是:

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

不应该在此之前:

header('Location:mydomain');

3

是的,在 header 之前你不应该输出任何内容。试着在页面顶部放置以下代码:

<?php ob_start(); ?>

然后在页面底部放置:

<?php ob_end_flush(); ?>

谢谢,它正在运行,你们是最棒的,对于一个新手来说,提供快速帮助和出色的建议... 谢谢。 - Abel
虽然这可能有效,但我真的建议你不要将其作为编程习惯,因为它是绝对不可取的。 - BudwiseЯ
请在末尾使用ob_end_flush()函数。 - StaticVariable
@user1741191,正如Budwiser所建议的那样,这不是一个好的编程方法。 - StaticVariable

2

这段代码 echo "<pre>"; print_r($_POST); 是用来做什么的?

你的重定向可能会在任何 echo 函数被调用之前发生,对吗?


echo "<pre>"; print_r($_POST); 显然是用来调试 $_POST 数据的。但问题在于,提问者没有意识到这会阻止修改头部信息。 - BudwiseЯ

2

这是PHP中非常常见的问题。以下是解决方法:

  1. 在页面顶部使用 。

  2. 检查是否在php开标签之前或php闭标签之后意外添加了一些空格。

  3. 如果仍然无法解决,可以使用JavaScript的window.location代替header。

希望有所帮助。 祝编码愉快!


1
您会收到此警告的原因是在输出变量值到屏幕并在此之后使用header重定向。
在打印某些内容(echo, print_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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接